码迷,mamicode.com
首页 > 其他好文 > 详细

5thweek.problem_B(zoj 1093) LIS

时间:2015-08-15 22:52:55      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

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\n",t++,maxn);
67   }
68 
69   return 0;
70 }

 

 

5thweek.problem_B(zoj 1093) LIS

标签:

原文地址:http://www.cnblogs.com/x512149882/p/4733163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!