POJ 1088滑雪(纯DP的方法)

来源:互联网 发布:js让金额不为0 编辑:程序博客网 时间:2024/05/17 01:21
刚才写过了dfs的方法
现在回顾一下dp算法

dp的算法看起来比dfs 好理解的多 当然dfs设计复杂的递归本来就不是一种好理解的算法。

我们首先用struct data 存储节点
这个节点是由坐标和 height值组成的。
data arr【maxn】;
具体步骤就是输入 赋值arr数组
然后从小到大排序
我们的思想是从height最小的那个点开始
探查它的上下左右四个点  一旦发现比它大的 并且dp值可以更新的就更新
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10005;struct Data{int x,y,h;};Data arr[maxn];int height[105][105];int dp[105][105];bool Cmp(const Data & a,const Data & b){    return a.h<b.h;}int i,j,k,c,r;int main(){    scanf("%d%d",&c,&r);    int index=0;    for(i=1;i<=c;++i)    {        for(j=1;j<=r;++j)        {            arr[index].x=i;            arr[index].y=j;            scanf("%d",&arr[index].h);            height[i][j]=arr[index].h;            dp[i][j]=1;            index++;        }    }    sort(arr,arr+c*r,Cmp);    for(i=0;i<c*r;++i)    {        if(height[arr[i].x+1][arr[i].y]>arr[i].h)        {            if(dp[arr[i].x+1][arr[i].y]<dp[arr[i].x][arr[i].y]+1)            dp[arr[i].x+1][arr[i].y]=dp[arr[i].x][arr[i].y]+1;        }        if(height[arr[i].x-1][arr[i].y]>arr[i].h)        {            if(dp[arr[i].x-1][arr[i].y]<dp[arr[i].x][arr[i].y]+1)            dp[arr[i].x-1][arr[i].y]=dp[arr[i].x][arr[i].y]+1;        }        if(height[arr[i].x][arr[i].y+1]>arr[i].h)        {            if(dp[arr[i].x][arr[i].y+1]<dp[arr[i].x][arr[i].y]+1)            dp[arr[i].x][arr[i].y+1]=dp[arr[i].x][arr[i].y]+1;        }        if(height[arr[i].x][arr[i].y-1]>arr[i].h)        {            if(dp[arr[i].x][arr[i].y-1]<dp[arr[i].x][arr[i].y]+1)            dp[arr[i].x][arr[i].y-1]=dp[arr[i].x][arr[i].y]+1;        }    }    int max=1;    for(i=1;i<=c;++i)    {        for(j=1;j<=r;++j)        {            if(dp[i][j]>max)            max=dp[i][j];        }    }    printf("%d\n",max);    return 0;}


原创粉丝点击