zoukankan      html  css  js  c++  java
  • 5thweek.problem_B(zoj 1093) LIS

    Description

    一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。
     
    研究人员有n种类型的砖块,每种类型的砖块都有无限个。第i块砖块的长宽高分别用xi,yi,zi来表示。 同时,由于砖块是可以旋转的,每个砖块的3条边可以组成6种不同的长宽高。
     
    在构建塔时,当且仅当A砖块的长和宽都分别小于B砖块的长和宽时,A砖块才能放到B砖块的上面,因为必须留有一些空间让猴子来踩。
     
    你的任务是编写一个程序,计算猴子们最高可以堆出的砖块们的高度。

    Input

    输入文件包含多组测试数据。
    每个测试用例的第一行包含一个整数n,代表不同种类的砖块数目。n<=30.
    接下来n行,每行3个数,分别表示砖块的长宽高。
    当n= 0的时候,无需输出任何答案,测试结束。

    Output

    对于每组测试数据,输出最大高度。格式:Case 第几组数据: maximum height = 最大高度

    Sample Input

    1
    10 20 30  2  6 8 10  5 5 5  7  1 1 1  2 2 2  3 3 3  4 4 4  5 5 5  6 6 6  7 7 7  5  31 41 59  26 53 58  97 93 23  84 62 64  33 83 27  0 

    Sample Output

    Case 1: maximum height = 40
    Case 2: maximum height = 21  Case 3: maximum height = 28  Case 4: maximum height = 342 
     
    题目分析:
    1.定义一个结构体存储砖块的长宽高,每输入一个砖块的长宽高,由于砖块可以旋转,因此可以直接将此砖块的六种状态存进结构体数组。init(a,b,c);    init(a,c,b;
    init(b,a,c);   init(b,c,a); init(c,a,b); init(c,b,a);
    2.然后将此机构图数组按:长、宽、高从小到大排序。
    3.状态转移
     
    代码及简要分析:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 struct cuboid
     7 {
     8     int l,w,h;
     9 }cu[190];
    10 int dp[190];
    11 
    12 int k;
    13 void init(int x,int y,int z)
    14 {
    15  cu[k].l=x; cu[k].w=y; cu[k].h=z; k++;
    16 }
    17 bool cmp(const cuboid &a,const cuboid &b)
    18 {
    19     if(a.l==b.l)
    20     {
    21         if(a.w==b.w)
    22             return a.h<b.h;
    23         //else
    24         return a.w<b.w;
    25     }
    26     //else
    27     return a.l<b.l;
    28 }
    29 
    30 int main()
    31 {
    32   int n,i,j,a,b,c,maxn,t=1;
    33   while(cin>>n && n)
    34   {
    35       k=0,maxn=0;
    36     for(i=0;i<n;i++)
    37     {
    38        scanf("%d%d%d",&a,&b,&c);
    39        init(a,b,c);
    40        init(a,c,b);
    41        init(b,a,c);
    42        init(b,c,a);
    43        init(c,a,b);
    44        init(c,b,a);
    45     }
    46     sort(cu,cu+k,cmp);
    47    // for(i=0;i<k;i++)
    48      //   cout<<cu[i].l<<"  "<<cu[i].w<<"  "<<cu[i].h<<endl;
    49 
    50     for(i=0;i<k;i++)
    51     {
    52         dp[i]=cu[i].h;
    53     }
    54     for(i=1;i<k;i++)
    55     {
    56         for(j=0;j<i;j++)     //j<i且j=0开始,j不可等于i
    57        {
    58         if(cu[i].l>cu[j].l && cu[i].w>cu[j].w && dp[j]+cu[i].h>dp[i] )
    59             {
    60                 dp[i]=dp[j]+cu[i].h;
    61                if(maxn<dp[i])
    62                 maxn=dp[i];
    63             }
    64        }
    65     }
    66     printf("Case %d: maximum height = %d
    ",t++,maxn);
    67   }
    68 
    69   return 0;
    70 }
     
  • 相关阅读:
    java导出pdf格式文档
    本地文件夹选择框
    将文件解除占用
    Windows 进入上帝模式窗口
    Windows 10 系统获取密钥方法
    CentOS7 systemctl 命令
    一键立即息屏
    定时关闭程序
    CentOS 7 FTP的安装与配置
    SQL基础
  • 原文地址:https://www.cnblogs.com/x512149882/p/4733163.html
Copyright © 2011-2022 走看看