思路:使用动态规划,dp[i][j]表示从起点到{i, j}的累计最大礼物价值。所以可以写出状态转移方程:p[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
代码:
class Solution {
public int maxValue(int[][] grid) {
int rows = grid.length;
int cols = grid[0].length;
int[][] dp = new int[rows][cols];
dp[0][0] = grid[0][0];
for(int i = 1; i < cols; i++){
dp[0][i] += dp[0][i - 1] + grid[0][i];
}
for(int i = 1; i < rows; i++){
dp[i][0] += dp[i - 1][0] + grid[i][0];
}
for(int i = 1; i < rows; i++){
for(int j = 1; j < cols; j++){
dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]) + grid[i][j];
}
}
return dp[rows - 1][cols - 1];
}
}
复杂度分析:时间o(m*n),空间为o(1)