1. 程式人生 > >DFS+DP【洛谷P1434】

DFS+DP【洛谷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;
}