剑指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];
}
}