• (动态规划 最长有序子序列)Monkey and Banana --HDU --1069


    链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1069

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87813#problem/E

    代码:

    ///此题目考察到动态规划里的最长有序子序列
    
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    #define N 200
    #define INF 0xfffffff
    
    struct node {int x, y, z, h, s;} a[N];
    
    int cmp(node n1, node n2)
    {
        return n1.s < n2.s;
    }
    
    int main()
    {
        int n, K=1;
    
        while(scanf("%d", &n), n)
        {
            int i, j, k=0, x, y, z;
            for(i=1; i<=n; i++)
            {
                scanf("%d%d%d", &x, &y, &z);
                a[k].x=x, a[k].y=y, a[k].z=z, a[k++].s=x*y;
                swap(x, z);
                a[k].x=x, a[k].y=y, a[k].z=z, a[k++].s=x*y;
                swap(y, z);
                a[k].x=x, a[k].y=y, a[k].z=z, a[k++].s=x*y;
            }
    
            sort(a, a+k, cmp);
    
            for(i=0; i<k; i++)///和最长单调递增子序列相似
            {
                int Max = 0;
                for(j=0; j<i; j++)
                {
                    if(((a[i].x>a[j].y && a[i].y>a[j].x) || (a[i].x>a[j].x && a[i].y>a[j].y)) && a[j].h>Max)
                    {
                        Max = a[j].h;
                    }
                }
                a[i].h = a[i].z + Max;
            }
    
            int ans = 0;
            for(i=0; i<k; i++)
                ans = max(ans, a[i].h);
    
            printf("Case %d: maximum height = %d
    ", K++, ans);
        }
        return 0;
    }

    代码2:

    /*
    HDU1069Monkey and Banana
    题目:给出一些长方体,然后让你把他堆成塔,
    要求下面的塔的要比上面的塔大(长和宽),
    而且每一种长方体的数量都是无限的。
    
    此题目考察到动态规划里的最长有序子序列,
    
    */
    #include<stdio.h>
    #include<algorithm>
    const int MAXN=200;
    using namespace std;
    struct Block
    {
        int x,y,high;
        int dp;//该箱子在最下面时的最大高度 
    }b[MAXN];
    
    bool cmp(Block a,Block b)//用sort函数排序,先按x后按y升序
    {
        if(a.x<b.x) return 1;
        else if(a.x==b.x&&a.y<b.y)  return 1;
        else return 0;
    }        
    int main()
    {
        int n,i,x,y,z,j,k;
        int iCase=0;
        while(scanf("%d",&n),n)
        {
            iCase++;
            k=0;
            while(n--)
            {
                scanf("%d%d%d",&x,&y,&z);
                //把给出的block放置的所有可能放进block[]中,这样就可以解决有无限块的问题
                if(x==y)
                {
                    if(y==z)//三个相等,放一个就够了
                    {
                        b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
                    }
                    else  //x==y!=z时三种放法
                    {
                        b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=z;b[k].y=y;b[k].high=x;b[k].dp=b[k].high;k++;
                        b[k].x=y;b[k].y=z;b[k].high=x;b[k].dp=b[k].high;k++;
                    }                         
                }
                else
                {
                    if(y==z)//三种放法
                    {
                        b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=y;b[k].y=x;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=y;b[k].y=z;b[k].high=x;b[k].dp=b[k].high;k++;
                    } 
                    else if(x==z)
                    {
                        b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=y;b[k].y=x;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=x;b[k].y=z;b[k].high=y;b[k].dp=b[k].high;k++;
                    }  
                    else//三个不等6种放法 
                    {
                        b[k].x=x;b[k].y=y;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=y;b[k].y=x;b[k].high=z;b[k].dp=b[k].high;k++;
                        b[k].x=x;b[k].y=z;b[k].high=y;b[k].dp=b[k].high;k++;
                        b[k].x=z;b[k].y=x;b[k].high=y;b[k].dp=b[k].high;k++;
                        b[k].x=y;b[k].y=z;b[k].high=x;b[k].dp=b[k].high;k++;
                        b[k].x=z;b[k].y=y;b[k].high=x;b[k].dp=b[k].high;k++;
                    }          
                }        
            } 
            sort(b,b+k,cmp);
            int maxh=0;
            for(i=1;i<k;i++)
            {
                for(j=0;j<i;j++)
                   if(b[i].x>b[j].x&&b[i].y>b[j].y)
                      b[i].dp=max(b[j].dp+b[i].high,b[i].dp);
                if(b[i].dp>maxh)maxh=b[i].dp;
            } 
            printf("Case %d: maximum height = %d
    ",iCase,maxh);      
        }  
        return 0;  
    }
    勿忘初心
  • 相关阅读:
    ubuntu网络配置相关知识(转载)
    git 冲突解决(转载)
    redmine后台运行命令
    CentOS配置网卡,重启网络显示:Device does not seem to be present(转载)
    解决Xshell和vim中文乱码(转载)
    REDHAT6.2配置yum源(64位)(转载)
    Doki Doki Literature Club ZOJ
    CONTINUE...? ZOJ
    Magic Points ZOJ
    Cash Machine (POJ 1276)(多重背包——二进制优化)
  • 原文地址:https://www.cnblogs.com/YY56/p/4731198.html
Copyright © 2020-2023  润新知