414周赛·第四题 - 3283. 吃掉所有兵需要的最多移动次数
1.414周赛·第二题 - 3281. 范围内整数的最大得分2.414周赛·第三题 - 3282. 到达数组末尾的最大得分
3.414周赛·第四题 - 3283. 吃掉所有兵需要的最多移动次数
4.414周赛·第一题 - 3280. 将日期转换为二进制表示题目链接 | 3283. 吃掉所有兵需要的最多移动次数 |
---|---|
思路 | 动态规划 |
题解链接 | 相邻相关排列型状压 DP(Python/Java/C++/Go) |
关键点 | 状态压缩DP 1. 预处理-如何得到“最少移动步数”-BFS & 转换为“位于 |
时间复杂度 | |
空间复杂度 |
代码实现:
DIRS = ((2, 1), (1, 2), (-1, 2), (-2, 1), (-2, -1), (-1, -2), (1, -2), (2, -1)) class Solution: def maxMoves(self, kx: int, ky: int, positions: List[List[int]]) -> int: n = len(positions) # 计算马到兵的步数,等价于计算兵到其余格子的步数 distances = [[[-1] * 50 for _ in range(50)] for _ in range(n)] # 下列循环时间复杂度为 O(nL^2) for d, (px, py) in zip(distances, positions): d[px][py] = 0 q = [(px, py)] step = 1 while q: new_q = [] for x, y in q: for dx, dy in DIRS: nx, ny = x + dx, y + dy if 0 <= nx < 50 and 0 <= ny < 50 and d[nx][ny] < 0: d[nx][ny] = step new_q.append((nx, ny)) q = new_q step += 1 positions.append((kx, ky)) u = (1 << n) - 1 # 调用复杂度为 O(n^2 2^n) @cache def dfs(i: int, mask: int) -> int: if mask == 0: return 0 odd = (u ^ mask).bit_count() % 2 answer = inf if odd else 0 op = min if odd else max x, y = positions[i] for j, d in enumerate(distances): if mask >> j & 1: answer = op(answer, dfs(j, mask ^ (1 << j)) + d[x][y]) return answer return dfs(n, u)
分类:
LeetCode / 周赛
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库