题面描述
思路
琪琪乖乖的。
状态挺好想的,记忆化搜索自己想不起来了,看了题解才恍然大悟。
AC code
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
const int N=110;
int f[N][N],n,m,a[N][N];
inline bool pd(int x,int y){return x>=1&&x<=n&&y>=1&&y<=n;}
int dfs(int x,int y)
{
if(f[x][y]!=1)return f[x][y];
int g=0;
if(pd(x,y+1)&&a[x][y+1]<a[x][y])g=max(g,dfs(x,y+1)+1);
if(pd(x,y-1)&&a[x][y-1]<a[x][y])g=max(g,dfs(x,y-1)+1);
if(pd(x+1,y)&&a[x+1][y]<a[x][y])g=max(g,dfs(x+1,y)+1);
if(pd(x-1,y)&&a[x-1][y]<a[x][y])g=max(g,dfs(x-1,y)+1);
f[x][y]=max(f[x][y],g);
return f[x][y];
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),f[i][j]=1;
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(f[i][j]==1)ans=max(dfs(i,j),ans);
printf("%d\n",ans);
return 0;
}