题意:把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长
和宽短;求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等).
思路:其实就是求最长的单调递减序列。在长和宽的递减下,求最大能得出的最大高度了
#include<iostream> #include<cstdio> using namespace std; struct po { int x; int y; int z; }p[200]; int com(const void *a,const void *b) { struct po *c=(po *)a; struct po *d=(po *)b; if(c->x==d->x) return c->y-d->y; return c->x-d->x; } int t=1; int main() { int n,i,j,xx,yy,zz,len,max; while(cin>>n&&n!=0) { len=0; for(i=0;i<n;i++) { cin>>xx>>yy>>zz; p[len].x=xx; p[len].y=yy; p[len].z=zz; ++len; p[len].x=yy; p[len].y=xx; p[len].z=zz; ++len; p[len].x=zz; p[len].y=yy; p[len].z=xx; ++len; p[len].x=yy; p[len].y=zz; p[len].z=xx; ++len; p[len].x=xx; p[len].y=zz; p[len].z=yy; ++len; p[len].x=zz; p[len].y=xx; p[len].z=yy; ++len; } qsort(p,len,sizeof(p[1]),com); for(i=1;i<len;i++) { max=0; for(j=0;j<i;j++) if(((p[i].x>p[j].x&&p[i].y>p[j].y)||(p[i].x>p[j].y&&p[i].y>p[j].x))&&p[j].z>max) max=p[j].z; p[i].z=p[i].z+max; } max=0; for(i=0;i<len;i++) if(p[i].z>max) max=p[i].z; cout<<"Case "<<t<<": maximum height = "<<max<<endl; t++; } return 0; }