剣はオファー47を指します。贈り物の最大の価値

剣はオファー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];
    }
}

次のようにしかし、あなたが定義した場合に改正されます。Fromgrid[0][0]grid[i - 1][j - 1]最も取得するためdp[i][j]の貴重な贈り物をもう1つの行と1つの列を開くことで、ベースケースを初期化する手間を省くことができます。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