题源洛谷P1434 [SHOI2002]滑雪
一开始看错题了,以为要求能到达的最大高度差,结果卡了好久(泪目
思路源于题解
#include<bits/stdc++.h>
using namespace std;
int R,C,a[1000][1000],d[1000][1000],ans=0; //d用来储存每个节点的最大路径
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int solve(int x,int y){
if(d[x][y]) return d[x][y]; //判断是否搜索过此点,如是,则直接返回距离
int xx,yy;
d[x][y]=1;
for(int i=0;i<4;i++){
xx=x+dx[i];
yy=y+dy[i];
if(xx>0 && yy>0 && xx<=R && yy<=C && a[x][y]>a[xx][yy]) //判断边界以及是否能到达
d[x][y]=max(d[x][y],solve(xx,yy)+1);
}
return d[x][y];
}
int main(){
cin >> R >> C;
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++) cin >> a[i][j];
memset(d,0,sizeof(d)); //清空数组d
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
ans=max(ans,solve(i,j));
cout << ans;
return 0;
}