猴子喫香蕉

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 

Sample Output

Case 1: maximum height = 40

Case 2: maximum height = 21 
Case 3: maximum height = 28 
Case 4: maximum height = 342 


題意:
有n中類型的磚塊,每種磚塊的長,寬,高分別爲xi,yi,zi,且每種磚塊的數量無限,由於磚塊可以旋轉,這使得磚塊的長,寬有八種可能,現在要做的是,下面放一塊磚塊,上面接着放,但是要求上面磚塊的長寬必須大於下面磚塊的長和寬,問你這樣堆積起來的塔最大有多高。
思路:
先定義一個結構體,用來盛放磚塊,裏面還要定義一個運算符,按照磚塊的長,寬來排序,用一個數組x[i],保存磚塊 的長寬高,按照磚塊長寬進行降序排列,因爲要使長寬大的儘量拍在下面,這樣堆積其來的才高,當得到maxn時用dp[i]累加,當束循環之後ans與dp[i]比較取最大值就就是最後答案。
#include<cstdio>
#include<algorithm>
using namespace std;
struct brick
{
    int a,b,c;
    bool operator<(const brick &x)const
    {
        return a<x.a||a==x.a&&b<x.b;
    }
};
brick x[130];
long long dp[130];
int main()
{
    int n,a[3],k=1;
    while(scanf("%d",&n)&&n)
    {

        int f=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d%d",&a[0],&a[1],&a[2]);
            sort(a,a+3);
            x[f].a=a[0];
            x[f].b=a[1];
            x[f].c=a[2];
            f++;
            x[f].a=a[0];
            x[f].b=a[2];
            x[f].c=a[1];
            f++;
            x[f].a=a[1];
            x[f].b=a[0];
            x[f].c=a[2];
            f++;
            x[f].a=a[1];
            x[f].b=a[2];
            x[f].c=a[0];
            f++;
        }
        sort(x,x+f);
        for(int i=0; i<f; i++)
            dp[i]=x[i].c;
        long long ans=0;
        for(int i=0; i<f; i++)
        {
            int maxn=0;
            for(int j=i-1; j>=0; j--)
                if(x[i].a>x[j].a&&x[i].b>x[j].b)
                {
                    if(maxn<dp[j])
                    {
                        maxn=dp[j];
                    }
                }
                dp[i]+=maxn;
                ans=max(ans,dp[i]);
        }
        printf("Case %d: maximum height = %I64d\n",k++,ans);

    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章