剑指 Offer 47. 礼物的最大价值

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

剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode) (leetcode-cn.com)

思路:动态规划,因为当前格子(i,j)只能从上边的格子(i,j-1)或左边的格子(i-1,j)走一步得到,所以,走到当前格子的礼物价值就等于上一个格子(两种情况)加上当前格子礼物的价值的总价值的较大者;第一行的格子只能从左边走到右边,第一列的格子只能从上边走到下边,所以特殊处理。由于(i,j)只和(i,j-1),(i-1,j)有关,所以可以直接在原数组上操作

class Solution {
    public int maxValue(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        for(int i = 1; i < n; i++){
            grid[0][i] = grid[0][i - 1] + grid[0][i];
        }

        for(int i = 1; i < m; i++){
            grid[i][0] = grid[i - 1][0] + grid[i][0];
        }

        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++){
                grid[i][j] = Math.max(grid[i - 1][j], grid[i][j - 1] ) + grid[i][j];
            }
        }

        return grid[m - 1][n - 1];
    }
}

 

上一篇:数据可视化基础专题(47):NUMPY基础(12)numpy 函数 (一)字符串函数


下一篇:2021.5.31.20:47