标签:
每个箱子可有3种叠加方式,所以有3*n个箱子。将箱子按长度由大到小排序,有求箱子按宽度的最长下降子序列的高度之和即可。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define MAX(a,b) (a>b)?a:b #define MIN(a,b) (a>b)?b:a const int SIZE=100+6;//尽量大一些; struct node{ int l; int w; int h; }; node box[3*SIZE]; bool comp(node no1, node no2) { return no1.l > no2.l; } int main() { int n; int t=0; while(scanf("%d",&n)!=EOF&&n!=0) { for(int i=0;i<n;i++) { int x,y,z; scanf("%d %d %d",&x,&y,&z); box[i*3+0].h=x;box[i*3+0].l=MAX(y,z);box[i*3+0].w=MIN(y,z); box[i*3+1].h=y;box[i*3+1].l=MAX(x,z);box[i*3+1].w=MIN(x,z); box[i*3+2].h=z;box[i*3+2].l=MAX(y,x);box[i*3+2].w=MIN(y,x); } sort(box,box+3*n,comp); int ans=-1; int h[SIZE]; memset(h,0,sizeof(h)); for(int i=0;i<3*n;i++) { h[i]=box[i].h; for(int j=0;j<i;j++) { if(box[i].w<box[j].w&&box[i].l<box[j].l) { h[i]=MAX(h[j]+box[i].h,h[i]); } } ans=MAX(h[i],ans); } printf("Case %d: maximum height = %d\n",++t,ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/4695244.html