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 30Sample Output
Case 1: maximum height = 40 Case 2: maximum height = 21題意:把給定的長方體疊加在一起,他們的長寬高可以隨意交換,疊加的條件是,上面一個長方體的長和寬都比下面長方體的長
和寬短;求這些長方體能疊加的最高的高度.(其中(3,2,1)可以擺放成(3,2,1)(3,1,2)、(2,1,3)等).在前面一句話看出來點什麼沒??沒有的話繼續往下看
思路:其實就是求最長的單調遞減序列。在長和寬的遞減下,求最大能得出的最大高度了。
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; struct node { int l,w,h; } a[111]; int dp[111]; int cmp(node a,node b) { if(a.l>b.l) return 1; if(a.l==b.l&&a.w>b.w) return 1; else return 0; } int main() { int b[3],t,n,k,sum,f=1; while(cin>>t&&t) { k=0; for(int i=0; i<t; i++) { cin>>b[0]>>b[1]>>b[2]; sort(b,b+3);
//記住,這道題可以這麼想,長一定大於寬,不然就不叫長了,所以只要找到高的三種情況即可 a[k].l=b[2]; a[k].w=b[1]; a[k].h=b[0]; //每個長方體最小的高 k++; a[k].l=b[2]; a[k].w=b[0]; a[k].h=b[1];//每個長方體第二高的高 k++; a[k].l=b[1]; a[k].w=b[0]; a[k].h=b[2];//每個長方體最高的高 k++; } sort(a,a+k,cmp); for(int i=0; i<k; i++) dp[i]=a[i].h; for(int i=k-2; i>=0; i--) //下一層 for(int j=i+1; j<k; j++) //上一層 { if(a[i].l>a[j].l&&a[i].w>a[j].w) //長和寬都要小於上一層的 if(dp[i]<dp[j]+a[i].h) //如果找到更大的高,就要更新 dp[i]=dp[j]+a[i].h; } sum=dp[0]; for(int i=0; i<k; i++) if(sum<dp[i]) sum=dp[i]; printf("Case %d: maximum height = %d\n",f++,sum); } return 0; }