动态规划:状态标识f[i][j]表示从(0,0)走到(i,j)所能拿到礼物的最大价值。状态转移:只能从上方或者左方走到(i,j),从上方走到(i,j),那么拿到礼物的价值为f[i-1][j]+grid[i][j];从左方走到(i,j),那么拿到礼物的价值为f[i][j-1]+grid[i][j]。需要注意边界判断。两者取max即可。我这里对空间复杂度进行优化,只需要记录grid[i][j]的值即可优化空间复杂度。
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param grid int整型二维数组
* @return int整型
*/
public int maxValue (int[][] grid) {
// write code here
int n = grid.length, m = grid[0].length;
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
int x = grid[i][j];
if(i - 1 >= 0) {
grid[i][j] = Math.max(grid[i][j],x + grid[i-1][j]);
}
if(j - 1 >= 0) {
grid[i][j] = Math.max(grid[i][j],x + grid[i][j-1]);
}
}
}
return grid[n-1][m-1];
}
}