leetcode-礼物的最大价值

268 阅读2分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目描述

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

  • 示例 1:
输入: 
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 13521 可以拿到最多价值的礼物
  • 提示:
`0 < grid.length <= 200`
`0 < grid[0].length <= 200`

实现思路

这题考验我们使用动态规划,获取m*n的矩阵从左上角到右下角的最优路径得到最多礼物价值。因为第一行和第一列只能向右和向下移动我们可以先计算出来。

比如:

[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]

计算后得:

[
  [1,4,5],
  [2,5,1],
  [6,2,1]
]

其余格子由于只能通过上边和左边的格子移动过来也就是,上边和左边的格子二选一,因为题目要求礼物最大所以我们得到判断条件是上边和左边的格子取较大的那一个,遍历矩阵可得:

[
  [1,4,5],
  [2,9,10],
  [6,11,12]
]

这样我们到达每个格子都是获取礼物价值最大的路径,题目要求到右下角的格子,我们直接返回右下角的二维数组坐标就可到题解了。

/**
 * @param {number[][]} grid
 * @return {number}
 */
var maxValue = function(grid) {
    let column = grid[0].length
    let row = grid.length
    for (let i = 1; i < column; i++) {
        grid[0][i] += grid[0][i - 1] 
    }
    for (let i = 1; i < row; i++) {
        grid[i][0] += grid[i - 1][0] 
    }
    for (let i = 1; i< row; i++) {
        for (let j = 1; j < column; j ++) {
            grid[i][j] += Math.max(grid[i-1][j], grid[i][j-1])
        }
    }
    return grid[row - 1][column - 1]
};