2017. 网格游戏

💡 LeetCode 博弈类动态规划题:两个机器人的点数游戏解析(gridGame)

🧩 题目描述

给定一个下标从 0 开始的二维数组 grid,大小为 2 x n,其中 grid[r][c] 表示矩阵中 (r, c) 位置上的点数。现在有两个机器人参与一场“点数游戏”。

  • 两个机器人都从起点 (0, 0) 出发,目标位置为 (1, n-1)
  • 每个机器人只能向右向下移动。
  • 游戏规则如下:
    1. 第一个机器人先行动,从起点走到终点,收集路径上的所有点数
    2. 每当机器人经过某个格子,格子中的点数将被清零(即不能再被第二个机器人收集)。
    3. 接着,第二个机器人在更新后的 grid 上,从起点再次走到终点,收集尽可能多的点数。

两个机器人都发挥自己的最佳水平。
第一个机器人希望第二个机器人收集的点数尽可能少,而第二个机器人希望自己获得尽可能多的点数。

你需要返回:第二个机器人最终获得的点数(在双方博弈最优策略下)


🧠 解题分析

这个题本质上是一个 博弈优化问题,而不是一个传统路径动态规划问题。题目中两个关键点:

  1. 第一个机器人会影响第二个机器人的路径可用性(通过清零)
  2. 双方都采用最优策略:一个最小化对方收益,一个最大化自身收益。

✅ 路径特点

考虑机器人从 (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第一行剩余点数第二行前面点数第二个机器人最大可得点数
05 + 4 = 90max(9, 0) = 9
141max(4, 1) = 4
201 + 5 = 6max(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)一般优化空间但略损可读性

🧠 总结

这道题虽然看似是路径收集问题,实质是一个零和博弈问题。最优策略的本质在于:

  • 第一个机器人控制路径影响第二个;
  • 第二个机器人总是在剩余点数最多路径中选择。

通过枚举策略 + 前缀和加速判断,可以轻松解决这道题,并深入理解“在约束下的最优选择博弈模型”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值