JZ初中OJ 2000. [2015.8.6普及組模擬賽] Leo搭積木


題目描述

         Leo是一個快樂的火星人,總是能和地球上的OIers玩得很high。
         2012到了,Leo又被召回火星了,在火星上沒人陪他玩了,但是他有好多好多積木,於是他開始搭積木玩。
       火星人能制造n種積木,積木能無限供應。每種積木都是長方體,第i種積木的長、寬、高分別為li、wi、hi。積木可以旋轉,使得長寬高任意變換。Leo想要用這些積木搭一個最高的塔。問題是,如果要把一個積木放在另一個積木上面,必須保證上面積木的長和寬都嚴格小於下面積木的長和寬。這意味着,即使兩塊長寬相同的積木也不能堆起來。
       火星上沒有電腦,好心的你決定幫助Leo求出最高的塔的高度。

【提示】
每種積木都可以拆分成高度分別為li、wi、hi的三種積木,另兩邊作為長和寬,保證長>=寬。
 

輸入

第一行,一個整數n,表示積木的種數
接下來n行,每行3個整數li,wi,hi,表示積木的長寬高

輸出

一行一個整數,表示塔高的最大值
 

樣例輸入

Sample Input1:
1
10 20 30


Sample Input2:
2
6 8 10
5 5 5



Sample Input3:
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27

 

樣例輸出

Sample Output1:
40


Sample Output2:
21


Sample Output3:
342
 

數據范圍限制

對於30%的數據 n<=8
對於100%的數據 n<=3000,最后答案不會超過32位整型
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct Node{
 4     int w,l,h;
 5 }a[10001];
 6 bool bdx(Node c,Node d)
 7 {
 8     return c.l<d.l;
 9 }
10 int main()
11 {
12     freopen("brick.in","r",stdin);
13     freopen("brick.out","w",stdout);
14     int n,f[10001],ans;
15     cin>>n;
16     int o,p,q;
17     for(int i=1;i<=n;i++)
18     {
19         cin>>o>>p>>q;
20         a[i].l=max(o,p);a[i].w=min(o,p);a[i].h=q;
21         a[i+n].l=max(o,q);a[i+n].w=min(o,q);a[i+n].h=p;
22         a[i+2*n].l=max(p,q);a[i+2*n].w=min(p,q);a[i+2*n].h=o;
23     }
24     sort(a+1,a+3*n+1,bdx);
25     for(int i=1;i<=3*n;i++)
26         f[i]=a[i].h;
27     for(register int i=3*n;i>=1;i--)
28         for(register int j=i+1;j<=3*n;j++)
29             if(a[i].w<a[j].w && a[i].l != a[j].l)
30                 f[i]=max(f[j]+a[i].h,f[i]);
31     for(int i=1;i<=3*n;i++)
32     ans=max(ans,f[i]);
33     cout<<ans;
34 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM