题目
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于
0)。
你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。
给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
输入: [ [1,3,1], [1,5,1], [4,2,1] ]
输出: 12
解释: 路径 1→3→5→2→1
可以拿到最多价值的礼物
提示:
0 < grid.length <= 200
0 < grid[0].length <= 200
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/li-wu-de-zui-da-jie-zhi-lcof
解题思路
解题思路引用自作者:gfu
- 把第1行 和 第1列 用前缀和的方式处理。
- 双重for循环
外层for从第2行开始,最后1行结束
内层for从第2列开始,最后1列结束
比较左方和上方的值,并取其中较大者,加到当前位置的值上
返回最右下角的值
如:
- [1,3,1]
[1,5,1]
[4,2,1]
把 第1行 和 第1列 分别用前缀和的方式处理,得:
- [1,4,5]
[2,5,1]
[6,2,1]
再遍历剩余位置,取当前位置的上边和左边中的较大者,加到当前位置的值上:
-
[1,4,5]
[2,5,1]
[6,2,1] -
加粗部分为所要遍历的位置
- 先从加粗的5开始(第2行,第2列)
- 取左边(2)和上边(4)的较大者(4)
- 加到当前位置的值(5)上
得到第2行,第2列:
- [1,4,5]
[2,9,1]
[6,2,1]
重复上述步骤,依次得到:
已处理第2行,第3列 (1 + max(9, 5) = 1 + 9 = 10):
- [1,4,5]
[2,9,10]
[6,2,1]
已处理第3行,第2列 (2 + max(9, 6) = 2 + 9 = 11):
- [1,4,5]
[2,9,10]
[6,11,1]
已处理第3行,第3列 (1 + max(11, 10) = 1 + 11 = 12):
- [1,4,5]
[2,9,10]
[6,11,12]
全部处理完毕,返回最右下角的值(12)
代码
–执行用时:8 ms --内存消耗:3.9 MB
func max (a,b int)int{
if a >= b{
return a
}
return b
}
func maxValue(grid [][]int) int {
row := len(grid) - 1
col := len(grid[0]) - 1
for i := 0;i <= row;i++{
for j := 0;j <= col;j++{
//把第1行 和 第1列 分别用前缀和的方式处理
if i == 0 && j == 0{
continue
}
if i == 0{
grid[i][j] += grid[i][j-1]
continue
}
if j == 0{
grid[i][j] += grid[i-1][j]
continue
}
//遍历剩余位置,取当前位置的上边和左边中的较大者,加到当前位置的值上
grid[i][j] += max(grid[i-1][j],grid[i][j-1])
}
}
//最后一位为累计最大值
return grid[row][col]
}