公众号开发程序,陕西seo优化,网站建设太金手指六六十八,北京网站建设模板主题2017. 网格游戏
给你一个下标从 0 开始的二维数组 grid #xff0c;数组大小为 2 x n #xff0c;其中 grid[r][c] 表示矩阵中 (r, c) 位置上的点数。现在有两个机器人正在矩阵上参与一场游戏。
两个机器人初始位置都是 (0, 0) #xff0c;目标位置是 (1, n-1) 。每个机器…2017. 网格游戏
给你一个下标从 0 开始的二维数组 grid 数组大小为 2 x n 其中 grid[r][c] 表示矩阵中 (r, c) 位置上的点数。现在有两个机器人正在矩阵上参与一场游戏。
两个机器人初始位置都是 (0, 0) 目标位置是 (1, n-1) 。每个机器人只会 向右 ((r, c) 到 (r, c 1)) 或 向下 ((r, c) 到 (r 1, c)) 。
游戏开始第一个 机器人从 (0, 0) 移动到 (1, n-1) 并收集路径上单元格的全部点数。对于路径上所有单元格 (r, c) 途经后 grid[r][c] 会重置为 0 。然后第二个 机器人从 (0, 0) 移动到 (1, n-1) 同样收集路径上单元的全部点数。注意它们的路径可能会存在相交的部分。
第一个 机器人想要打击竞争对手使 第二个 机器人收集到的点数 最小化 。与此相对第二个 机器人想要 最大化 自己收集到的点数。两个机器人都发挥出自己的 最佳水平 的前提下返回 第二个 机器人收集到的 点数 。
示例 1 输入grid [[2,5,4],[1,5,1]]
输出4
解释第一个机器人的最佳路径如红色所示第二个机器人的最佳路径如蓝色所示。
第一个机器人访问过的单元格将会重置为 0 。
第二个机器人将会收集到 0 0 4 0 4 个点。示例 2 输入grid [[3,3,1],[8,5,2]]
输出4
解释第一个机器人的最佳路径如红色所示第二个机器人的最佳路径如蓝色所示。
第一个机器人访问过的单元格将会重置为 0 。
第二个机器人将会收集到 0 3 1 0 4 个点。示例 3 输入grid [[1,3,1,15],[1,3,3,1]]
输出7
解释第一个机器人的最佳路径如红色所示第二个机器人的最佳路径如蓝色所示。
第一个机器人访问过的单元格将会重置为 0 。
第二个机器人将会收集到 0 1 3 3 0 7 个点。提示
grid.length 2 n grid[r].length 1 n 5 * 104 1 grid[r][c] 105
解题思路
以示例一为例子 通过观察可得只要机器人一选出了任意一条路径那么机器人二无论如何最多只能收集第一行或者第二行中未被置为0的那部分点数。例如示例一机器人二无论走什么路径最多只能收集第一行的点数总和4或者第二行的点数总和1.因此我们可以尝试全部机器人一的路径但是因为我们只是关心第一行和第二行置为0以后的点数因此可以使用前缀和快速得出每一行置为0以后的剩余点数机器人二就会选择剩余点数多的那行进行收集而我们的目的就是找出使得机器人二收集最少点数的路径
代码
class Solution {
public:long long gridGame(vectorvectorint grid) {int ngrid[0].size();vectorlong long pre1(n),pre2(n);pre1[0]grid[0][0];pre2[0]grid[1][0];for (int i 1; i n; i) {pre1[i]pre1[i-1]grid[0][i];pre2[i]pre2[i-1]grid[1][i];}long long s1pre1[n-1],s2pre2[n-1];long long ms1-pre1[0];for (int i 1; i n; i) {mmin(m,max(s1-pre1[i],pre2[i-1]));}return m;}
};