首页 > 代码库 > hdu 1069

hdu 1069

题意:把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长
和宽短;求这些长方体能叠加的最高的高度.(其中(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;
}