1、前言

2、思路
就是一个很普通的记忆化的 dfs,当然可以改成 dp
3、代码
class Solution {
public int maxValue(int[][] grid) {
if(grid == null || grid.length == 0 || grid[0].length == 0){
return 0;
}
int[][] memo = new int[grid.length][grid[0].length];
return dfs(grid, 0, 0, memo);
}
private int dfs(int[][] grid, int i, int j, int[][] memo){
if(i >= grid.length || j >= grid[0].length){
return 0;
}
if(i == grid.length - 1 && j == grid[0].length - 1){
return grid[grid.length - 1][grid[0].length - 1];
}
if(memo[i][j] != 0){
return memo[i][j];
}
memo[i][j] = Math.max(dfs(grid, i + 1, j, memo), dfs(grid, i, j + 1, memo)) + grid[i][j];
return memo[i][j];
}
}
动态规划初始化,记得累加:
class Solution {
public int maxValue(int[][] grid) {
if(grid == null || grid.length == 0 || grid[0].length == 0){
return 0;
}
int m = grid.length, n = grid[0].length;
int[][] dp = new int[m][n];
dp[0][0] = grid[0][0];
// 初始化的时候,记得是累加
for(int i = 1; i < m; i++){
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for(int i = 1; i < n; i++){
dp[0][i] = dp[0][i - 1] + grid[0][i];
}
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[m - 1][n - 1];
}
}
网友评论