class Solution {
public int maxValue(int[][] g) {
if (g.length == 0 || g[0].length == 0) return 0;
int n = g.length, m = g[0].length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i == 0 && j == 0) continue;
if (i == 0) g[i][j] += g[i][j - 1];
else if (j == 0) g[i][j] += g[i - 1][j];
else g[i][j] += Math.max(g[i][j-1], g[i-1][j]);
}
}
return g[n-1][m-1];
}
}
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 = 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];
}
}
滚动数组
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length;
int 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-1],dp[j]) + grid[i-1][j-1];
}
}
return dp[n];
}
}
共以下 13 个回答
一维注意初始化
和LeetCode 64. 最小路径和 同理,最小值改为最大值即可
时间复杂度:O(N)
空间复杂度:O(1)
跟路径和那题一样
时间:O(n*m)
时间复杂度为O(mn),空间复杂度为O(1)
之前题目的优化版本
二维数组。时间复杂度O(mn)空间复杂度O(mn)
滚动数组
//动态规划>& grid) {
class Solution {
public:
int maxValue(vector<vector
int m=grid.size(),n=grid[0].size();
for(int i=1;i<m;++i) grid[i][0]+=grid[i-1][0];
for(int i=1;i<n;++i) grid[0][i]+=grid[0][i-1];
for(int i=1;i<m;++i){
for(int j=1;j<n;++j){
grid[i][j]+=max(grid[i-1][j],grid[i][j-1]);
}
}
return grid[m-1][n-1];
}
};
时间:O(mn),空间:O(1)