【解题思路】
首先想到的是使用深度优先搜索的方法,代码如下:
class Solution {
int ans = 0;
int m, n;
public int maxValue(int[][] grid) {
m = grid.length;
n = grid[0].length;
DFS(grid, 0, 0, grid[0][0]);
return ans;
}
public void DFS(int[][] grid, int row, int col, int value)
{
if(row == m-1 && col == n-1)
{
if(value > ans)
{
ans = value;
}
}
else
{
int[][] dire = {{0,1}, {1,0}};
for(int i = 0; i < 2; i++)
{
int newRow = row + dire[i][0];
int newCol = col + dire[i][1];
if(newRow < m && newCol < n)
{
value += grid[newRow][newCol];
DFS(grid, newRow, newCol, value);
value -= grid[newRow][newCol];
}
}
}
}
}
通过了部分测试用例,超出时间限制。
要想提高运行效率,想到了使用动态规划。maxValue[i][j] = Max{maxValue[i-1][j], maxValue[i][j-1] } + grid[i][j]。即每一个位置的最大值,等于它上边和左边中最大的数,再加上它的值。
为了方便计算,构造maxValue[m+1][n+1], 其中maxValue[i][j]对应grid[i-1][j-1]。
class Solution {
public int maxValue(int[][] grid) {
int ans = 0;
int m = grid.length, n = grid[0].length;
int[][] maxValue = new int[m+1][n+1];
for(int i = 1; i <= m; i++)
{
for(int j = 1; j <= n; j++)
{
maxValue[i][j] = Math.max(maxValue[i-1][j], maxValue[i][j-1]) + grid[i-1][j-1];
}
}
return maxValue[m][n];
}
}