HDU 1069
// 题意 : 给出立方体长宽高 ,求摆放的最高高度,摆放在下面的立方体长宽大于上方的 #include<cstdlib> #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 200; int len[200]; struct node { int x,y,z; void init(int xx,int yy, int zz) { x = xx; y = yy; z = zz; } }; node a[200]; bool cmp(node a,node b) { return (a.x*a.y < b.x*b.y); } int main() { int t=1,n,x,y,z; while(scanf("%d",&n)!=EOF && n) { int cnt=0; for(int i=0;i<n;i++) { scanf("%d%d%d",&x,&y,&z); a[cnt++].init(x,y,z); a[cnt++].init(y,z,x); a[cnt++].init(x,z,y); a[cnt++].init(y,x,z); a[cnt++].init(z,x,y); a[cnt++].init(z,y,x); //六种摆放的方式 } sort(a,a+cnt,cmp); // 按底面积排序 int mx=0; for(int i=0;i<cnt;i++ ) //LIS { len[i] = a[i].z; for(int j=0;j<i;j++) { if(a[j].x < a[i].x && a[j].y < a[i].y) { len[i] = max(len[i], len[j] + a[i].z); mx = max(mx, len[i]); } } } printf("Case %d: maximum height = %d\n",t++,mx); } return 0; }