求助
查看原帖
求助
1101704
zhenyiwaizhong楼主2024/10/15 17:27

为什么一定要从每个点走一遍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;
}

上面两段代码,第一段为什么不可以?第二段感觉时间复杂度比第一段高多了

2024/10/15 17:27
加载中...