POJ 1088 (DP)

来源:互联网 发布:九洲盛世网络竞技 编辑:程序博客网 时间:2024/04/29 16:46

   感觉没啥技巧,中文题开始都看错了,以为 25-1的距离就是25,现在感觉很不在状态啊, 加油,调整状态。

   首先,这题拿到了就感觉得先把结点按照高度(升序)进行排序,然后在从低高度向高高度前进,这题另外需要注意就是集中存储结构相互结合,别人怎么做的我不知道,我自己的必须得找出 x,y处高度在前面排序中的rank。

来看代码吧

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define N 10010using namespace std;typedef struct{int x,y,h;}Node;Node a[N];int di[4][2] = {1,0,-1,0,0,1,0,-1};bool cmp(Node a,Node b){    return a.h<b.h;}int n,m;int dp[N];int map[101][101];//存储原图int rank[101][101];//原图中x,y的rankint main(){    cin >> n >> m;//行和列    int p = 0;    for(int i=1; i<=n; ++i)     for(int e=1; e<=m; ++e)    {    cin >> a[++p].h;    map[i][e] = a[p].h;    a[p].x = i; a[p].y = e;    }     sort(a+1, a+n*m+1, cmp);     for(int i=1; i<=n*m; ++i)        dp[i] = 1;     for(int i=1; i<=n*m; ++i)      {        rank[a[i].x][a[i].y] = i;      }      for(int i=1; i<=n*m; ++i)//主要DP的位置,就是按照其高度进行遍历      {        int kk,ff;       for(int e=0; e<4; ++e)       {         kk = a[i].x + di[e][0]; ff = a[i].y + di[e][1];         if(0<kk&&kk<=n&&ff>0&&ff<=m&&map[kk][ff] < a[i].h&&dp[i] < dp[rank[kk][ff]]+1)            dp[i] = dp[rank[kk][ff]] + 1;       }      }      int ma = 0;      for(int i=1; i<=n*m; ++i)        if(ma < dp[i])            ma = dp[i];        cout << ma <<endl;    return 0;}


原创粉丝点击