记忆化搜索。。
对每个点能走的最远进行记录,如果走过,直接返回上一层。。
最后遍历找出最大值。。
<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int q,w;
}s[104][105];
int a,b;
int yy[105][105];
int map[4][2]={1,0,-1,0,0,1,0,-1};
int dfs(int c,int d)
{
if(s[c][d].w!=1)
{
return s[c][d].w;
}
int n,m,max=0;
for(int i=0;i<4;i++)
{
int e=c+map[i][0];
int f=d+map[i][1];
if(e>0&&e<=a&&f<=b&&f>0&&s[c][d].q>s[e][f].q)
{
if(max<dfs(e,f))
s[e][f].w=max=dfs(e,f);//这记录着每个点走的距离,但是没有对最终返回的值进行记录,少这个会超时
}
}
return max+1;
}
int main()
{
scanf("%d %d",&a,&b);
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
scanf("%d",&s[i][j].q);
s[i][j].w=1;
}
}
int maxn;
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
// memset(yy,0,sizeof(yy));
if(s[i][j].w==1)
{
maxn=dfs(i,j);
s[i][j].w=maxn;//记录最终返回的值
}
}
}
for(int i=1;i<=a;i++)
{
for(int j=1;j<=b;j++)
{
// printf("%d\n",s[i][j].w);
if(s[i][j].w>maxn)
maxn=s[i][j].w;
}
}
printf("%d\n",maxn);
return 0;
}
</span>