POJ 1088 动态规划

来源:互联网 发布:中纪海富软件开发公司 编辑:程序博客网 时间:2024/06/05 05:12
            感觉这道题目对我学习动态规划还是挺有启发的,我一看这道题目的第一反应就是,动态规划。之后,我又在想,我该用什么样的循序规划那。因为地图上给的点都不是按顺序的,所以我又放弃的动态规划的思路。虽然是A了,但还是觉得动态规划是可行的,于是。。。。。。就去问的学长。(我真的好水的)

           其实纠结点就在动态规划的循序上,(我是从小到大的循序),高的点一定是在低的的后面找到的,所以,如果我们对所有的点,以高度为基准从小到大排个序(其实从大到小也行,就是看自己怎么理解了),按照这的循序去动态规划他就OK了!

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#define N 110using namespace std;int map[N][N];struct node{    int x,y;    int h;}que[N*N];int f[][2]={-1,0,0,-1,0,1,1,0};int dp[N][N];bool cmp( node a ,node b){    return a.h <b.h;}int main(){    int n,m;    while(scanf("%d%d",&n,&m)!=EOF){        int sum=1;        for(int i=0;i<n;i++)        for(int j=0;j<m;j++){            scanf("%d",&map[i][j]);            que[sum].x=i;            que[sum].y=j;            que[sum].h=map[i][j];            //dp[sum++]=1;            ++sum;            dp[i][j]=1;        }        sum--;       // cout<<1<<endl;       sort(que+1,que+1+sum,cmp);       //for(int i=1;i<=sum;i++)cout<<que[i].h<<" ";cout<<endl;      // cout<<1<<endl;       int max1=1;       for(int i=1;i<=sum;i++)           for(int j=0;j<4;j++){            int tx=que[i].x+f[j][0];            int ty=que[i].y+f[j][1];            if(0<=tx&&tx<n&&0<=ty&&ty<m&&que[i].h>map[tx][ty]){                dp[que[i].x][que[i].y]=max(dp[que[i].x][que[i].y],dp[tx][ty]+1);                max1=max(max1,dp[que[i].x][que[i].y]);            }        }        printf("%d\n",max1);    }    return 0;}


     这道题还可以用记忆化搜索去做

#include<iostream>#include<cstdio>#include<cstdlib>#define N 110using namespace std;int map[N][N];int dp[N][N];int n,m;int f[][2]={0,1,0,-1,1,0,-1,0};int dfs(const int x,const int y){    if(dp[x][y]!=0)return dp[x][y];    dp[x][y]=1;     for(int i=0;i<4;i++){        int tx=x+f[i][0];        int ty=y+f[i][1];        if(0<=tx&&tx<n&&0<=ty&&ty<m&&map[tx][ty]<map[x][y])        {
            dp[x][y]=max(dp[x][y],dfs(tx,ty)+1);        }    }    return dp[x][y];}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i=0;i<n;i++)        for(int j=0;j<m;j++){            scanf("%d",&map[i][j]);            dp[i][j]=0;        }        int max1=1;        for(int i=0;i<n;i++)        for(int j=0;j<m;j++){            if(dp[i][j]==0){                dfs(i,j);                max1=max(dp[i][j],max1);            }        }        printf("%d\n",max1);    }}


 

原创粉丝点击