难度:中等
题目描述:
在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
解题思路:
现在来看状态转移的过程:
出发点是左上角,且只能向右/下移动,所以第一列和第一行中的 dp 值,就等于:当前礼物价值+上一个 dp 值
对于一般坐标(i,j),dp[i][j] = grid[i][j] + max(dp[i - 1][j], dp[i][j - 1])
var maxValue = function(grid) {
//dp[i][j] = max{dp[i - 1][j], dp[i][j - 1]} + data[i][j]
const xLen = grid.length;
if(!xLen) return 0;
const yLen = grid[0].length;
let dp = [];
for(let i = 0; i < xLen + 2; i ++) {//最外层都是0,就不用考虑边界问题了,下面的状态转移方程也就优一点变化,但中心思想不变。
let arr = new Array(yLen + 2).fill(0);
dp[i] = arr;
}
// console.log(dp)
for(let x = 0; x < xLen; x ++) {
for(let y = 0; y < yLen; y ++) {
dp[x + 1][y + 1] = Math.max(dp[x][y + 1], dp[x + 1][y]) + grid[x][y];
}
}
// console.log(dp)
return dp[xLen][yLen];
};