poj 1088 滑雪(DFS +DP 记忆化搜索)

                       看到这这个题的时候,我想到了用动归,但不知怎嘛用,也考虑了DFS, 但仍然不知怎嘛用……无奈,上网参考了一下别人的代码,才AC了……哎,我是菜鸟啊……
#include<iostream>
using namespace std;

int r, c;
int a[101][101];
int dp[101][101]={0};
int d[4][2]={{0,-1},{0,1},{-1,0},{1,0}};

int dfs(int i, int j)
{
	int ii, jj, k, temp;
	if(dp[i][j])//已处理过,直接返回
		return dp[i][j];
	//状态转移方程 合法的情况下:DP(i,j) = max( DP(i,j-1), DP(i,j+1), DP(i-1,j), DP(i+1,j) ) + 1;
    for( k=0; k<4; k++)//由上下左右四个点得出dp[i][j]的最大值
	{
		ii=i+d[k][0];
		jj=j+d[k][1];
		if( (ii>=0&&ii<r) &&(jj>=0&&jj<c) && a[ii][jj]<a[i][j])
		{
			temp=dfs(ii, jj);
			if( dp[i][j]<temp+1 )
				dp[i][j]=temp+1;
		}
	}
	return dp[i][j];
}
int main()
{
    cin>>r>>c;
    int i, j, max, temp;
    max=-1;
    for( i=0; i<r; i++)
        for( j=0; j<c; j++)
        {
			cin>>a[i][j];
			dp[i][j]=0;
        }
		for( i=0; i<r; i++)
			for( j=0; j<c; j++)
			{
				temp=dfs(i, j);
				if( max<temp )
					max=temp;
			}
		cout<<max+1<<endl;
}

你可能感兴趣的:(poj 1088 滑雪(DFS +DP 记忆化搜索))