1 题目描述
2 算法思路
动态规划解析:
- 状态定义,dp[i][j] 代表从左上角开始,到(i,j)时,礼物的最大价值
- 转移方程:
- 当i = 0, j = 0,为起始元素
- 当i = 0,j != 0, 代表是第一行的元素,只能从左到右到达
- 当i != 0,j = 0,代表是第一列的元素,只能从上到下到达
- 当i != 0,j != 0 ,可以从左边,或者上边到达
- 初始状态:
- dp[0][0] = grid[0][0]
- dp[0][j] = grid[0][j] 第一行
- dp[i][0] = grid[i][0] 第一列
空间复杂度优化
- 由于dp[i][j] 只和 dp[i-1][j] dp[i][j-1] grid[i][j] 有关系,因此可以将原矩阵grid作为dp
3 代码
class Solution {
public int maxValue(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
for(int j = 1; j < n; j++){ //初始化第一行
grid[0][j] += grid[0][j - 1];
}
for(int i = 1; i < m; i++){
grid[i][0] += grid[i - 1][0];
}
for(int i = 1; i < m; i++){
for(int j =1; j < n; j++){
grid[i][j] += Math.max(grid[i - 1][j] , grid[i][j - 1]);
}
}
return grid[m - 1][n - 1];
}
}
4 提交结果