P1434 [SHOI2002]滑雪(记忆化搜索)

P1434 [SHOI2002]滑雪(记忆化搜索)

传送门
记录一下从每个位置开的最大值即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e2+5;
#define mst(a) memset(a,0,sizeof a)
#define lx x<<1
#define rx x<<1|1
#define reg register
inline void read(int &x){ 
	x=0;int w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
	for(;ch>='0'&&ch<='9';ch=getchar())
		x=(x<<3)+(x<<1)+(ch&15);
	x*=w; 
}
int R,C,a[N][N],ans,d[4][2]={1,0,-1,0,0,1,0,-1},mx[N][N];
int dfs(int x,int y){
	if(mx[x][y]) return mx[x][y];//记忆化搜索. 
	mx[x][y]=1;
	for(int i=0;i<4;i++){
		int nx=x+d[i][0],ny=y+d[i][1];
		if(nx>=1&&nx<=R&&ny>=1&&ny<=C&&a[nx][ny]<a[x][y]){
			  dfs(nx,ny);
			  mx[x][y]=max(mx[nx][ny]+1,mx[x][y]);//转移方程. 
		}
	}
	return mx[x][y];
}
int main(){
	read(R),read(C);
	for(reg int i=1;i<=R;i++)
		for(reg int j=1;j<=C;j++) read(a[i][j]);
	for(reg int i=1;i<=R;i++)
		for(reg int j=1;j<=C;j++){
			 ans=max(dfs(i,j),ans);
		}
	printf("%d\n",ans);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/106607371