代码展示:
class Solution {
public int maxValue(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
//创建dp数组
int[][]dp=new int[m+1][n+1];
//填充数组
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-1][j-1];
}
}
return dp[m][n];
}
}
进行动态规划的五个步骤:
1.状态表示
dp[i][j]表示从起点到[i][j]这个位置上能获得礼物的最大价值
2.状态转移方程
我们分析距离[i][j]最近的位置,根据题意我们到达[i][j]位置只能从[i-1][j]向下移动或者从
[i][j-1]向右移动,所以我们如何判断哪种方式下我们可以获得更大的价值呢,那就选择在最大价值的位置进行移动,而[i-1][j]和[i][j-1]的最大价值为dp[i-1][j]和dp[i][j-1],我们比较两者的值,从更大的价值的位置进行移动,移动后再加上[i][j]位置上自己的价值,便得到了dp[i][j]的值
所以我们得到状态转移方程 dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1],由于在创建dp数组时增加了辅助结点,相比于grid数组多了一行一列,所以两个数组之间的映射也发生了改变dp[i][j]对应grid[i-1][j-1]
3.初始化,通过具体示例分析,应该将第一行和第一列初始化为0才满足要求,而数组在创建时里面的数据就已经是0,所以没有写初始化的代码
4.从上到下,从左到右依次填充数组
5返回dp[m][n]的值