赤裸裸的记忆化搜索。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[101][101];
int f[101][101];
int r,c;
int dfs(int x,int y){
if(x<1||x>r||y<1||y>c)
return 0;
if(f[x][y]!=0)
return f[x][y];
int res1=0,res2=0,res3=0,res4=0;
if(a[x-1][y]<a[x][y])
res1=dfs(x-1,y);
if(a[x][y+1]<a[x][y])
res2=dfs(x,y+1);
if(a[x+1][y]<a[x][y])
res3=dfs(x+1,y);
if(a[x][y-1]<a[x][y])
res4=dfs(x,y-1);
f[x][y]=max(res1,max(res2,max(res3,res4)))+1;
return f[x][y];
}
int main(){
int i,j;
scanf("%d%d",&r,&c);
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
scanf("%d",&a[i][j]);
memset(f,0,sizeof(f));
int maxx=0;
for(i=1;i<=r;i++)
for(j=1;j<=c;j++)
if(maxx<dfs(i,j))
maxx=dfs(i,j);
printf("%d\n",maxx);
return 0;
}