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

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

题目描述

在这里插入图片描述

解题思路

二维dp

定义:从 grid[0][0]grid[i][j] 最多能拿到 dp[i][j]价值的礼物

class Solution {
    
    
    public int maxValue(int[][] grid) {
    
    
        if (grid == null || grid.length == 0 || grid[0] == null || grid[0].length == 0) return 0;
        int rows = grid.length, cols = grid[0].length;
        //定义:从 grid[0][0] 到 grid[i][j] 最多能拿到 dp[i][j] 价值的礼物
        int[][] dp = new int[rows][cols];
        //base case : dp[0][j] = ∑grid[0][0]...grid[0][j] ; dp[i][0] = ∑grid[0][0]...grid[i][0]
        dp[0][0] = grid[0][0];
        for (int i = 1; i < rows; i++) dp[i][0] = dp[i - 1][0] + grid[i][0];
        for (int j = 1; j < cols; j++) dp[0][j] = dp[0][j - 1] + grid[0][j];

        for (int i = 1; i < rows; i++) {
    
    
            for (int j = 1; j < cols; j++) {
    
    
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        return dp[rows - 1][cols - 1];
    }
}

但如果将定义修改为:从 grid[0][0]grid[i - 1][j - 1]最多能拿到 dp[i][j] 价值的礼物 。就可以通过多开一行一列,来免去初始化 base case 的麻烦,即 dp[0][j] = dp[i][0] = 0

class Solution {
    
    
    public int maxValue(int[][] grid) {
    
    
        if (grid == null || grid.length == 0 || grid[0] == null || grid[0].length == 0) return 0;
        int rows = grid.length, cols = grid[0].length;
        //定义:从 grid[0][0] 到 grid[i - 1][j - 1] 最多能拿到 dp[i][j] 价值的礼物
        //base case : dp[0][j] = dp[i][0] = 0
        int[][] dp = new int[rows + 1][cols + 1];

        for (int i = 1; i <= rows; i++) {
    
    
            for (int j = 1; j <= cols; j++) {
    
    
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
            }
        }
        return dp[rows][cols];
    }
}

猜你喜欢

转载自blog.csdn.net/cys975900334/article/details/115323643