UVA437

题意: N个立方体,给出长宽高,把他们堆起来,最高能堆多高,要求在下面的立方体的长宽严格大于在上面的。

其实原本我是不会的,然后看了网上大神的做法 = =详见代码

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 struct node
 6 {
 7     int c,k,g;
 8     void init(int x,int y,int z)
 9     {
10         c=x; k=y; g=z;
11     }
12 }a[200];
13 int len[200];
14 bool cmp(node x,node y)
15 {
16     return (x.c*x.k)<(y.c*y.k);
17 }
18 int main()
19 {
20     int n,x,y,z,cnt=0;
21     while(scanf("%d",&n)!=EOF && n)
22     {
23         int m=0;
24         for(int i=0;i<n;i++)
25         {
26             scanf("%d%d%d",&x,&y,&z);   // 立方体的六种摆放方法全部存起来 
27             a[m++].init(x,y,z);
28             a[m++].init(x,z,y);
29             a[m++].init(y,x,z);
30             a[m++].init(y,z,x);
31             a[m++].init(z,x,y);
32             a[m++].init(z,y,x);
33         }
34         sort(a,a+m,cmp);  // 按照底面积排个序 ,在上面的立方体底面积一定小
35         int mx=-1; len[0]=1;
36         for(int i=1;i<m;i++)   // LIS 求最高高度 
37         {
38             len[i]=a[i].g;
39             for(int j=0;j<i;j++)
40             {
41                 if((a[i].c>a[j].c) && (a[i].k>a[j].k))
42                 {
43                     len[i]=max(len[i],len[j]+a[i].g);
44                     mx=len[i]>mx?len[i]:mx;
45                 }
46             }
47         }
48         printf("Case %d: maximum height = %d\n",++cnt,mx);
49     }
50     return 0;    
51 }

 

posted @ 2015-10-08 19:52  Ember  阅读(231)  评论(0编辑  收藏  举报