起点:矩阵左上角
终点:矩阵右下角
只能向下或向右,求礼物总价值最大的路径
状态定义:dp[i][j]表示从矩阵左上角开始,到(i,j)时拿到的礼物最大累计价值
转移方程:
i = 0,j = 0,起始元素
i = 0,j != 0,为矩阵第一行元素,只能向右移动dp[i][j] = dp[i][j-1] + grid[i][j]
i != 0,j = 0,为矩阵第一列元素,只能向下移动dp[i][j] = dp[i-1][j] + grid[i][j]
i != 0,j != 0,可向下向右 dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + grid[i][j]
初始状态:dp[0][0] = grid[0][0]
返回值:dp[m-1][n-1],dp矩阵右下角值
dp[i][j]只与dp[i][j-1],dp[i-1][j],grid[i][j]有关,可以用变量
class Solution{
public int maxValue(int[][] grid){
int m = grid.length, n = grid[0].length;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++)
if(i != 0 && j != 0)grid[i][j] += Math.max(grid[i-1][j],grid[i][j-1]);
else if(i != 0 && j == 0)grid[i][j] += grid[i-1][j];
else if(i == 0 && j != 0) grid[i][j] += grid[i][j-1];
else continue;
}
return grid[m-1][n-1];
}
}