算法题:礼物的最大价值

77 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

吃着吃着停电了,我连忙扒拉了两口饭,突然灯亮了,我惊呼,莫非这就是传说中的扒拉拉能亮。

题目

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

示例 1:

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

想法:

在棋盘中移动的方向只能是向下或向右,在众多行列中判断它的上一步是向下还是向右是一件难的事情,诡计多端的棋盘格。但如果抛开其他不提,只考虑第一行与第一列那么就简单了起来。

已经处在第一行的元素,它的上一步移动方式一定是向右。

已经处在第二列的元素,它的上一步移动方式一定是向下。

其他的呢,那就在移动前判断下边儿元素与右边儿元素哪个大,然后移动。

表示方法:

总行数:数组.length-1;总列数:数组[0].length-1.

代码be like:

 * @param {number[][]} grid
 * @return {number}
 */
var maxValue = function (grid) {
   let i, j, m = grid.length, n = grid[0].length;
    for(i = 0; i < m; i++) {
        for(j = 0; j < n; j++) {
            if(!i && !j) {
                continue;
            } else if(i === 0) {
                // 在第一行,肯定是从左边移动过来的
                grid[i][j] = grid[i][j] + grid[i][j - 1];
            } else if(j === 0) {
                // 在第一列,肯定是从上边移动过来的
                grid[i][j] = grid[i][j] + grid[i - 1][j];
            } else {
                // 除了第一行第一列以外的元素
                grid[i][j] = grid[i][j] + Math.max(grid[i - 1][j], grid[i][j - 1])
            }
        }
    }
    return grid[m - 1][n - 1];
};

凑字数be like:

以前听南方室友说南方夏天的天气本就很热,下雨会更热的时候我都会和她展开激烈的讨论。eng?下雨后雨水不是会蒸发吗,雨水蒸发不是会吸热吗,吸热不是会降温吗,怎么会汗蒸人,我不信。

如今竟然真的有这种怪天气,外面明明下了很大的雨却又闷热的不行,知识点+1 。

想拥有小熊一体锅的第4天。