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 }