题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1226
DFS+记忆化搜索
#include<stdio.h>
#define N 105
#define INF 200
int maps[N][N];
int ans[N][N];
int dfs(int x,int y)
{
if(ans[x][y]>0)
return ans[x][y];
if(maps[x+1][y]<maps[x][y])
if(dfs(x+1,y)+1>ans[x][y])
ans[x][y]=ans[x+1][y]+1;
if(maps[x-1][y]<maps[x][y])
if(dfs(x-1,y)+1>ans[x][y])
ans[x][y]=ans[x-1][y]+1;
if(maps[x][y+1]<maps[x][y])
if(dfs(x,y+1)+1>ans[x][y])
ans[x][y]=ans[x][y+1]+1;
if(maps[x][y-1]<maps[x][y])
if(dfs(x,y-1)+1>ans[x][y])
ans[x][y]=ans[x][y-1]+1;
return ans[x][y];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s[N];
int n,m,i,j;
scanf("%s%d%d",s,&n,&m);
for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
maps[i][j]=INF;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&maps[i][j]);
ans[i][j]=-1;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if( maps[i+1][j]>maps[i][j] && maps[i-1][j]>maps[i][j] && maps[i][j+1]>maps[i][j] && maps[i][j-1]>maps[i][j])
ans[i][j]=1;
}
}
int Max=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(Max<dfs(i,j))
Max=ans[i][j];
}
}
printf("%s: %d\n",s,Max);
}
}