#include<bits/stdc++.h>
using namespace std;
/*
状态表示 f[i][j]
集合:表示所有从g[i][j]出发的路径长度
属性:max
状态划分
考虑下一步怎么走(前提是下一步可以走,即:下一步的高度小于当前所在的高度)
上 f[i-1][j] + 1
下 f[i+1][j] + 1
左 f[i][j-1] + 1
右 f[i][j+1] + 1
f[i][j]=上面四种情况中的最大值
*/
const int N=310;
int g[N][N],f[N][N];
int r,c;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int dp(int i,int j)
{
int &v=f[i][j];
if(v!=-1) return v;
v=1;//如果一个方向都走不了,那f[i][j]=1,表示路径上只有(i,j)一个点
for(int k=0;k<4;k++)
{
int x=i+dx[k],y=j+dy[k];
if(x>=1&&x<=r&&y>=1&&y<=c&&g[i][j]>g[x][y])
v=max(v,dp(x,y)+1);
}
return v;
}
int main()
{
memset(f,-1,sizeof f);
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
scanf("%d",&g[i][j]);
int res=-0x3f3f3f3f;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
res=max(res,dp(i,j));
printf("%d\n",res);
return 0;
}
滑雪(记忆化搜索)
最新推荐文章于 2024-06-24 20:29:36 发布