💡 LeetCode 博弈类动态规划题:两个机器人的点数游戏解析(gridGame)
🧩 题目描述
给定一个下标从 0 开始的二维数组 grid
,大小为 2 x n
,其中 grid[r][c]
表示矩阵中 (r, c)
位置上的点数。现在有两个机器人参与一场“点数游戏”。
- 两个机器人都从起点 (0, 0) 出发,目标位置为 (1, n-1)。
- 每个机器人只能向右或向下移动。
- 游戏规则如下:
- 第一个机器人先行动,从起点走到终点,收集路径上的所有点数。
- 每当机器人经过某个格子,格子中的点数将被清零(即不能再被第二个机器人收集)。
- 接着,第二个机器人在更新后的
grid
上,从起点再次走到终点,收集尽可能多的点数。
两个机器人都发挥自己的最佳水平。
第一个机器人希望第二个机器人收集的点数尽可能少,而第二个机器人希望自己获得尽可能多的点数。
你需要返回:第二个机器人最终获得的点数(在双方博弈最优策略下)。
🧠 解题分析
这个题本质上是一个 博弈优化问题,而不是一个传统路径动态规划问题。题目中两个关键点:
- 第一个机器人会影响第二个机器人的路径可用性(通过清零)。
- 双方都采用最优策略:一个最小化对方收益,一个最大化自身收益。
✅ 路径特点
考虑机器人从 (0, 0)
到 (1, n-1)
,由于只能向右或向下移动,他们的路径必然是:
- 在第一行从左向右移动若干列,然后向下走一次,到第二行;
- 然后再从左向右走到终点
(1, n-1)
。
即路径可以由一个“拐点列索引 i” 唯一确定:在第 i
列向下转弯。
🔧 解题方法
📌 关键观察
我们枚举第一个机器人在哪一列 i
向下,来模拟其路径,并计算:
- 它经过后将哪些格子清零;
- 在这些清零后的状态下,第二个机器人最多还能获得多少点数;
- 最后找到第二个机器人所有“最优对抗策略”中的最小值(即第一个机器人能造成的最优破坏效果)。
📈 前缀和优化
为了快速计算某段区间的点数之和,我们可以使用前缀和:
prefix_row0[i] = grid[0][0] + grid[0][1] + ... + grid[0][i-1]
prefix_row1[i] = grid[1][0] + grid[1][1] + ... + grid[1][i-1]
对于每个拐点 i
,我们计算:
- 第一行剩下的点数(在 i 后面):
prefix_row0[n] - prefix_row0[i+1]
- 第二行前面的点数(在 i 前面):
prefix_row1[i]
- 第二个机器人在这两部分中选择较大的(最优路径)
🧪 示例说明
以 grid = [[2,5,4],[1,5,1]]
为例:
我们遍历每一个拐点 i:
i | 第一行剩余点数 | 第二行前面点数 | 第二个机器人最大可得点数 |
---|---|---|---|
0 | 5 + 4 = 9 | 0 | max(9, 0) = 9 |
1 | 4 | 1 | max(4, 1) = 4 |
2 | 0 | 1 + 5 = 6 | max(0, 6) = 6 |
取所有情况中最小值:4
✅ 最终代码实现
class Solution:
def gridGame(self, grid: List[List[int]]) -> int:
n = len(grid[0])
# 计算前缀和
prefix_row0 = [0] * (n + 1)
prefix_row1 = [0] * (n + 1)
for i in range(n):
prefix_row0[i + 1] = prefix_row0[i] + grid[0][i]
prefix_row1[i + 1] = prefix_row1[i] + grid[1][i]
res = float('inf')
for i in range(n):
# 模拟机器人1在i处向下
upper = prefix_row0[n] - prefix_row0[i + 1]
lower = prefix_row1[i]
second_robot = max(upper, lower)
res = min(res, second_robot)
return res
📊 时间与空间复杂度分析
- 时间复杂度:O(n)
- 一次前缀和计算 O(n)
- 一次枚举拐点 O(n)
- 空间复杂度:O(n)
- 用于前缀和数组(可优化为常数空间)
🆚 分析与比较
方法 | 时间复杂度 | 空间复杂度 | 可读性 | 适用情况 |
---|---|---|---|---|
模拟 + 暴力路径枚举 | O(n²) | O(1) | 一般 | 不适用于较大 n |
前缀和优化(本文) | ✅ O(n) | ✅ O(n) | ✅ 高 | 推荐方法 |
常数空间版本 | ✅ O(n) | ✅ O(1) | 一般 | 优化空间但略损可读性 |
🧠 总结
这道题虽然看似是路径收集问题,实质是一个零和博弈问题。最优策略的本质在于:
- 第一个机器人控制路径影响第二个;
- 第二个机器人总是在剩余点数最多路径中选择。
通过枚举策略 + 前缀和加速判断,可以轻松解决这道题,并深入理解“在约束下的最优选择博弈模型”。