洛谷P1434 [SHOI2002]滑雪(记忆化搜索,DFS)

传送门 难度
https://www.luogu.com.cn/problem/P1434 普及/提高-

分析

  • 这道题需要使用记忆化搜索,否则会超时
  • 需要注意的是,并不一定从最高点开始的滑雪长度最长,所以会需要对每一个点尝试进行DFS
  • 我一开始的时候尝试的是BFS,试了多次都只能达到90分的程度(测试点2会超时)。可能在记忆化搜索这里,BFS的效果不如DFS吧。本题中DFS快,是因为DFS能够较快地得到一些点的最优值,之后可以很快进行大量的剪枝操作,而BFS慢慢地才能得到一些点的最优值。BFS在得到一个最优值的时候基本已经把一块“从高到低的滑雪连通域”给搜索全了。

AC代码

#include
#include
#include
#include
#include
#include

using namespace std;
int mp[105][105];
int R, C;
int res[105][105];
int st[4][2] = { {-1,0} ,{0,1}, {1,0},{0,-1} };


int dfs(int xx,int yy) {
	if (res[xx][yy])
		return res[xx][yy];
	res[xx][yy] = 1;
	for (int i = 0; i < 4; ++i) {
		int tx = xx + st[i][0];
		int ty = yy + st[i][1];
		if (tx < 0 || ty < 0 || tx >= R || ty >= C)
			continue;
		if (mp[tx][ty] < mp[xx][yy])
			res[xx][yy] = max(res[xx][yy], dfs(tx,ty)+1);
	}
	return res[xx][yy];
}


int main() {
	scanf("%d%d", &R, &C);
	for (int i = 0; i < R; ++i) {
		for (int j = 0; j < C; ++j) {
			scanf("%d", &mp[i][j]);
		}
	}
	int op = -1;
	for (int i = 0; i < R; ++i) {
		for (int j = 0; j < C; ++j) {
			op = max(op, dfs(i, j));
		}
	}
	printf("%d\n", op);
	return 0;
}

你可能感兴趣的:(DP—记忆化搜索,DFS)