难度:中等

    题目描述:
    在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

    示例:

    1. 输入:
    2. [
    3. [1,3,1],
    4. [1,5,1],
    5. [4,2,1]
    6. ]
    7. 输出: 12
    8. 解释: 路径 13521 可以拿到最多价值的礼物

    解题思路:
    现在来看状态转移的过程:

    出发点是左上角,且只能向右/下移动,所以第一列和第一行中的 dp 值,就等于:当前礼物价值+上一个 dp 值
    对于一般坐标(i,j),dp[i][j] = grid[i][j] + max(dp[i - 1][j], dp[i][j - 1])

    1. var maxValue = function(grid) {
    2. //dp[i][j] = max{dp[i - 1][j], dp[i][j - 1]} + data[i][j]
    3. const xLen = grid.length;
    4. if(!xLen) return 0;
    5. const yLen = grid[0].length;
    6. let dp = [];
    7. for(let i = 0; i < xLen + 2; i ++) {//最外层都是0,就不用考虑边界问题了,下面的状态转移方程也就优一点变化,但中心思想不变。
    8. let arr = new Array(yLen + 2).fill(0);
    9. dp[i] = arr;
    10. }
    11. // console.log(dp)
    12. for(let x = 0; x < xLen; x ++) {
    13. for(let y = 0; y < yLen; y ++) {
    14. dp[x + 1][y + 1] = Math.max(dp[x][y + 1], dp[x + 1][y]) + grid[x][y];
    15. }
    16. }
    17. // console.log(dp)
    18. return dp[xLen][yLen];
    19. };