从右下角的元素考虑,到达它有两种可能,要么是左边来的,要么是上面来的。
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+grid[i][j]; 而且还要考虑i-1>=0?j-1>=0
class Solution {
public int maxValue(int[][] grid) {
int m =grid.length;
int n=grid[0].length;
int[][] dp=new int[m][n];
dp[0][0]=grid[0][0];
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
int a=i-1>=0?dp[i-1][j]:0;
int b=j-1>=0?dp[i][j-1]:0;
dp[i][j]=Math.max(a,b)+grid[i][j];
}
}
return dp[m-1][n-1];
}
}
空间复杂度是O(n^2)
思路二
降空间复杂度为O(n),滚动数组 我还没有carry的下来,等carry了我再补充
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length, n = grid[0].length;
int[] dp = new int[n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
dp[j] = Math.max(dp[j], dp[j - 1]) + grid[i - 1][j - 1];
}
}
return dp[n];
}
}