DFS+DP【洛谷P1434】

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/KIKO_caoyue/article/details/83240527
今日推荐