看了网上的截图方法,感觉有些步骤是多余的,自己有些心得体会,记录一下。
1.动态规划问题
这种求最大值的我们一般可以用动态规划求解。我们想清楚设置一个矩阵dp[m][n]的矩阵。每个元素代表的值则表示到达这个位置的最大值。
那么dp[0][0] 就为1,dp[0][1] 为 4 dp[0][2] 为3
dp[1][0] 就为2,dp[1][1] 为 多少呢?
我们只需要判断他的左边(dp[i][j-1])和上边(dp[i-1][j])谁的值最大。那么表达式就为
dp[i][j] = max(dp[i][j-1],dp[i-1][j])+arr[i][j]。
那么问题就来了,因为0-1=-1超过数组的下界,所以我们dp数组可以从1,1开始。
int x = i+1;
int y = j+1;
dp[x][y] = Math.max(dp[x][y-1],dp[x-1][y]) + grid[i][j];
完整代码:
public int maxValue (int[][] grid) {
// write code here
int[][] dp = new int[grid.length+1][grid[0].length+1];
int i = 0;
int j = 0;
for(;i<grid.length;i++){
for(j = 0;j<grid[0].length;j++){
int x = i+1;
int y = j+1;
dp[x][y] = Math.max(dp[x][y-1],dp[x-1][y]) + grid[i][j];
}
}
return dp[i][j];
}
结果: