
【解题思路】
首先想到的是使用深度优先搜索的方法,代码如下:
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];
}
}
本文探讨了一种使用深度优先搜索(DFS)解决网格中找到最大路径价值的问题,虽然这种方法在部分测试用例中有效,但在时间效率上存在问题。为了解决时间限制,作者转向使用动态规划,通过维护一个二维数组maxValue来存储每个位置的最大值,从而达到优化计算速度的目的。该方法基于网格中每个位置的最大值等于其上边和左边中最大值加上当前位置的值。最后,给出了动态规划实现的代码。
235

被折叠的 条评论
为什么被折叠?



