1. 题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/c1ddfc73a1aa436eb6616012ca3ee7b1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Zi_6LSi57un57ut5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. 思路
(1) 动态规划
- 设f(i,j)为从棋盘左上角走至单元格(i,j)的礼物最大累计价值,可得递推公式:f(i,j)=grid(i,j)+max[f(i-1,j),f(i,j-1)]。
- 由于第一行只能从左边到达,第一列只能从上边到达,因此可以直接计算第一行和第一列的f(i,j),然后遍历其余单元格,根据递推公式计算每个单元格的f(i,j),最后返回右下角单元格的值。
- 只能迭代计算,递归计算会超时。
3. 代码
public class Test {
public static void main(String[] args) {
Solution solution = new Solution();
System.out.println(solution.maxValue(new int[][]{{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}));
}
}
class Solution {
public int maxValue(int[][] grid) {
for (int i = 1; i < grid.length; i++) {
grid[i][0] += grid[i - 1][0];
}
for (int j = 1; j < grid[0].length; j++) {
grid[0][j] += grid[0][j - 1];
}
for (int i = 1; i < grid.length; i++) {
for (int j = 1; j < grid[0].length; j++) {
grid[i][j] = grid[i][j] + Math.max(grid[i - 1][j], grid[i][j - 1]);
}
}
return grid[grid.length - 1][grid[0].length - 1];
}
}