题目链接:https://www.luogu.org/problemnew/show/P1434
本来以为是很简单得一个题目,直接暴力搜一遍图,保存一个最大值,结果T了qwq。
直接上思路:这其实是一道dp的题目,方程很好退,我就不放了(我也不是dp做的)
DFS+记忆化搜索就可以过了,而且速度很快。
dfs(x,y)表示走到(x,y)的时候的步数。
直接上代码比较清晰:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 110;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int G[maxn][maxn];
int f[maxn][maxn];
int r,c;
int cnt,ans;
void init()
{
memset(G,0,sizeof(G));
memset(f,-1,sizeof(f));
}
int dfs(int x,int y)
{
if(f[x][y]!=-1)
{
return f[x][y];
}
int tmp = 0,mx = 1;
for(int i=0;i<4;i++)
{
int nx = x+dx[i];
int ny = y+dy[i];
if(nx>=1 && nx<=r && ny>=1 && ny<=c && G[x][y]>G[nx][ny])
{
tmp = dfs(nx,ny)+1;
mx = max(mx,tmp);
}
}
return f[x][y] = mx;
}
int main()
{
while(cin>>r>>c)
{
init();
ans = 0;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>G[i][j];
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cnt = dfs(i,j);
ans = max(ans,cnt);
}
}
cout<<ans<<endl;
}
return 0;
}