题目描述:
解法1:
这是一道经典的动态规划题目。这道题没有要求不能在原来的数组上修改,所以我们可以定义一个新数组或者在原来的数组上修改。但是一般的话,我们都是创建一个和原来数组大小一样的新数组来存放结果。
首先,我们定义一个新数组。然后使用动态规划的思想,除去第一列和第一行,其他位置都有两种方法可以到达。一种是纵向,一种是横向,我们只要取其中价值最大的一种即可。对于第一列的元素,相互之间只能是横向到达。而第一行的元素,相互之间只能是纵向到达。最终,我们返回终点的元素就是这个二维数组的最大价值了。
class Solution {
public int maxValue(int[][] grid) {
int cols = grid[0].length;
int rows = grid.length;
int[][] dp = new int[rows][cols];
dp[0][0] = grid[0][0];
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
if(i==0&&j==0) continue;
else if(i==0&&j!=0) dp[i][j] = dp[i][j-1] + grid[i][j];
else if(i!=0&&j==0) dp[i][j] = dp[i-1][j] + grid[i][j];
else if(i!=0&&j!=0) dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
return dp[rows-1][cols-1];
}
}
解法2:
解法2和解法1的思路差不多,只是在它的基础上进行了优化。解法1因为每次遍历的过程中,都要进行第一行和第一列的判断,占用了不少时间。所以我们可以把第一行和第一列抽取出来,提前复制,那么下面在遍历的时候,就不用每次判断,减少了运行时间。
class Solution {
public int maxValue(int[][] grid) {
int cols = grid[0].length;
int rows = grid.length;
int[][] dp = new int[rows][cols];
dp[0][0] = grid[0][0];
for(int i = 1; i < cols; i++){
dp[0][i] = dp[0][i-1] + grid[0][i];
}
for(int j = 1; j < rows; j++){
dp[j][0] = dp[j-1][0] + grid[j][0];
}
for(int i = 1; i < rows; i++){
for(int j = 1; j < cols; j++){
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + grid[i][j];
}
}
return dp[rows-1][cols-1];
}
}