poj1088 滑雪

题目大意:给你一个二维数组,找到一个最长递减子序列的长度,某一点可以向上下左右四个方向移动.

分析:典型的动态规划题(错了好多次,也看了大神的代码);方法:dfs搜素+备忘录

http://vjudge.net/problem/viewProblem.action?id=16378


源代码:


/**
 *dfs+dp
 */
#include
#include
using namespace std;
int a[101][101],dp[101][101],c,r;
int dfs(int i,int j){
    if(dp[i][j]) return dp[i][j];//已访问,直接返回
    int k=1;
    if(i-1>=1&&a[i][j]>a[i-1][j]) k=max(dfs(i-1,j)+1,k);
    if(i+1<=c&&a[i][j]>a[i+1][j]) k=max(dfs(i+1,j)+1,k);
    if(j-1>=1&&a[i][j]>a[i][j-1]) k=max(dfs(i,j-1)+1,k);
    if(j+1<=r&&a[i][j]>a[i][j+1]) k=max(dfs(i,j+1)+1,k);
    return dp[i][j]=k;
}
int main()
{
    while(cin>>c>>r){
        for(int i=1;i<=c;i++){
            for(int j=1;j<=r;j++){
                cin>>a[i][j];
            }
        }
        memset(dp,0,sizeof(dp));
        int max=0;
        for(int i=1;i<=c;i++){
            for(int j=1;j<=r;j++){
                if(max             }
        }
        cout<     }
    return 0;
}


你可能感兴趣的:(dfs,dp,poj,喵喵~DP,ACMProblem)