题目描述
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例 1:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
解题思路: 动态规划
我们定义dp[i][j]表示加上当前格的礼物后的最大值, 因为只有往右下移动, 所以dp[i][j]分为3种情况
- 如果是i = 0, 也就是第一行, 那么dp[i][j] = dp[i][j-1] + arr[i][j]
- 如果是j = 0, 也就是第一列, 那么dp[i][j] = dp[i-1][j] + arr[i][j]
- 其他情况下, 我们可以选择往下或往右, 那么 那么dp[i][j] = max(dp[i-1][j] + arr[i][j], dp[i][j-1] + arr[i][j])
我们可以使用原数组直接存储结果, 因为遍历过的元素就没用了, 可以直接覆盖
示例代码
def maxValue(self, grid: [[int]]) -> int:
for i in range(len(grid)):
for j in range(len(grid[i])):
if i == 0 and j == 0:
continue
if i == 0:
grid[i][j] += grid[i][j - 1]
elif j == 0:
grid[i][j] += grid[i - 1][j]
else:
grid[i][j] += max(grid[i][j - 1], grid[i - 1][j])
return grid[-1][-1]