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 }