思路:
在深搜的同时,将每个点的最长长度保存下来,下次访问到这里直接使用就行,否则会超时。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
int s[110][110];
int d[110][110];
int b[4][2]={
0,1,
0,-1,
1,0,
-1,0
};
int r,c,ans;
int dfs(int x,int y)
{
if(d[x][y]) //长度已存在,直接返回就行
return d[x][y];
d[x][y]=1; //初始化时只有一个山峰,经过的山峰数为1
for(int i=0;i<4;i++)
{
int e = x+b[i][0];
int f = y+b[i][1];
if(s[x][y]>s[e][f] && e>=0&&e<r && f>=0&&f<c)
d[x][y] = max(d[x][y],dfs(e,f)+1); //每经过一个山峰,长度加 1
}
return d[x][y];
}
int main()
{
scanf("%d%d",&r,&c);
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
scanf("%d",&s[i][j]);
}
memset(d,0,sizeof(d));
ans = 0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
int m = dfs(i,j);
ans = max(ans,m);
}
}
printf("%d\n",ans);
return 0;
}