为什么一定要从每个点走一遍dfs,不能从最高点开始记忆化搜索然后直接搜索mem数组中的最大值吗
#include<iostream>
using namespace std;
int r, c;
const int N = 105;
int mem[N][N];
int nums[N][N];
int dfs(int x, int y)
{
int sum = 1;
if (mem[x][y])
return mem[x][y];
else
{
if (x < r - 1 && nums[x + 1][y] < nums[x][y])
sum = max(dfs(x + 1, y) + 1, sum);
if (x > 0 && nums[x - 1][y] < nums[x][y])
sum = max(dfs(x - 1, y) + 1, sum);
if (y < c - 1 && nums[x][y + 1] < nums[x][y])
sum = max(dfs(x, y + 1) + 1, sum);
if (y > 0 && nums[x][y - 1] < nums[x][y])
sum = max(dfs(x, y - 1) + 1, sum);
}
mem[x][y] = sum;
return sum;
}
int main()
{
cin >> r >> c;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
cin >> nums[i][j];
int x = 0, y = 0, mm = 0;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
if (nums[i][j] > mm)
{
mm = nums[i][j];
x = i;
y = j;
}
}
}
dfs(x, y);
int m = 0;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
m = max(m, mem[i][j]);
cout << m << endl;
return 0;
}
``````cpp
#include<iostream>
using namespace std;
int r, c;
const int N = 105;
int mem[N][N];
int nums[N][N];
int dfs(int x, int y)
{
int sum = 1;
if (mem[x][y])
return mem[x][y];
else
{
if (x < r-1 && nums[x + 1][y] < nums[x][y])
sum = max(dfs(x + 1, y) + 1, sum);
if (x > 0 && nums[x - 1][y] < nums[x][y])
sum = max(dfs(x - 1, y) + 1, sum);
if (y < c-1 && nums[x][y + 1] < nums[x][y])
sum = max(dfs(x, y + 1) + 1, sum);
if (y > 0 && nums[x][y - 1] < nums[x][y])
sum = max(dfs(x, y - 1) + 1, sum);
}
mem[x][y] = sum;
return sum;
}
int main()
{
cin >> r >> c;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
cin >> nums[i][j];
int res = 0;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
res = max(res, dfs(i, j));
cout << res << endl;
return 0;
}
上面两段代码,第一段为什么不可以?第二段感觉时间复杂度比第一段高多了