分析:
首先抛弃掉递归方法,因为指定会出现超时的问题,所以考虑动态规划,为节省空间,不再开辟新的二维数组,直接在原有数组上进行数值更改,缺点是原有数组会被破坏。
状态转移方程分析:
-1- i=0,j=0时 起点,必经过,不必考虑路径问题
-2- i或j一个为0 时,因为规定了只能向下,或向右进行。所以矩阵的最左一列(只能连续向下行进),最上一行(只能连续向右行进)内的价值可以先确定下来。
-3- 除去最左最上的行和列后,grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][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) continue;
if(i == 0) grid[i][j] += grid[i][j - 1] ;
else if(j == 0) grid[i][j] += grid[i - 1][j];
else grid[i][j] += Math.max(grid[i][j - 1], grid[i - 1][j]);
}
}
return grid[m - 1][n - 1];
}
}
思路存档,在当前位置求向下走和向右走的路的价值,哪个方向高,往哪个方向走(报错如图)