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;
}