注意:本题求的是最长的滑坡长度,而不是高度
用ans[x][y]表示从(x,y)这一点开始的最长滑坡
那么只要上下左右四个方向的高度比这一点的高度小,ans[x][y]就等于ans[x-1][y]或ans[x+1][y]或ans[x][y+1]或ans[x][y-1]加一,再从这几个值里选择一个最大的就行了
#include<iostream> using namespace std; int r,c;//r是行,c是列 int a[105][105],ans[105][105];//ans[i][j]储存i,j位置可到达的最大长度 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};//下,右,上,左四个方向 int res(int x,int y)//求(x,y)位置开始的最长滑坡 { if(ans[x][y]>0)return ans[x][y]; int i,maxx=0; for(i=0;i<=3;i++)//枚举4个方向 { int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=1&&nx<=r&&ny>=1&&ny<=c&&a[x][y]>a[nx][ny])//没有越界并且高度低于(x,y)的高度 { int t=res(nx,ny)+1;//长度加1 maxx=max(t,maxx); } } ans[x][y]=maxx; return maxx; } int main() { cin>>r>>c; int i,j; for(i=1;i<=r;i++) for(j=1;j<=c;j++) cin>>a[i][j];//输入每一点的高度 int maxx=0; for(i=1;i<=r;i++) for(j=1;j<=c;j++) maxx=max(maxx,res(i,j));//枚举所有位置开始的长度,找到最大的 cout<<maxx+1<<endl; }