算法:
方法一:前缀和
不用先求第一个 机器人取得最大值。关键在于理清楚第一个机器人走了之后,第二个机器人何时取得最大值。
不失一般性,我们可以假设第一个机器人走了一个Z字行,
那么,第二个机器人何时能取得最大值呢?假设第一个机器人在j位置移动到第二行,第二个机器人要么在第一行横着走到底,要么在第二行横着走到底。那么对于每一个j的位置,我们计算(第二个机器人要么在第一行横着走到底,要么在第二行横着走到底)这两种情况第二个机器人能取得的最小值即可。
func gridGame(grid [][]int) int64 {
n := len(grid[0])
preSum0, preSum1 := make([]int,n + 1), make([]int,n + 1)
for i := 1; i <= n; i ++ {
preSum0[i] = preSum0[i - 1] + grid[0][i - 1]
preSum1[i] = preSum1[i - 1] + grid[1][i - 1]
}
ans := math.MaxInt64
for i := 1; i <= n; i ++ {
grid0Max := preSum0[n] - preSum0[i]
grid1Max := preSum1[i - 1]
ans = min(max(grid1Max, grid0Max), ans)
}
return int64(ans)
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func max(a, b int) int {
if a > b {
return a
}
return b
}