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