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;
}