记忆化搜索——P1434滑雪

记忆化搜索也是动态规划的又一种体现形式,通过记忆化已经搜索过的情况并直接利用该值从而避免大量的重复搜索,极大的提高了效率。
试题链接:
https://www.luogu.com.cn/problem/P1434
代码如下:

#include
using namespace std;
int dp[105][105],a[105][105],n,m;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int dfs(int x,int y){
	if(dp[x][y]) return dp[x][y];//若已经访问过该路径,直接返回结果 
	int res=0;
	for(int i=0;i<4;i++){
		int xx=x+dx[i],yy=y+dy[i];
		//能访问该点的条件+更新从该点出发的最大长度 
		if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]<a[x][y]) res=max(dfs(xx,yy),res);
	}
	dp[x][y]=res+1;
	return dp[x][y];
}
int main(){
	int ans=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			ans=max(dfs(i,j),ans);//记录从每个点出发的最大长度,并不断更新 
		}
	}
	cout<<ans;
	return 0;
}

你可能感兴趣的:(洛谷)