ZOJ 1093 猴子与香蕉

/////////////////////////////////////////////////////////////////////
//猴子与香蕉
//把每一种方块化为三个,先排序,再用n^2的dp
#include<iostream>
#include<algorithm>
using namespace std;

 


struct block
{
    int x;
    int y;
    int height;
}bl[100];


void maxmin(int &a,int &b,int &c)
{
    if(a<b && a<c)
        if(b<c);
        else swap(b,c);
    else if(b<c && b<a)
    {
        swap(a,b);
        if(b<c);
        else swap(b,c);
    }
    else
    {
        swap(a,c);
        if(b<c);
        else swap(b,c);
    }
}


bool comp(const block &a, const block &b)
{
    if(a.x!=b.x) return (a.x<b.x);
    else return (a.y<=a.y);
}


int main()
{
    int i,j,n,a,b,c,count=1,max;
    while(cin>>n && n!=0)
    {
        for(i=1;i<=3*n;i=i+3)
        {
            cin>>a>>b>>c;
            maxmin(a,b,c);
            bl[i].x=a;
            bl[i].y=b;
            bl[i].height=c;

            bl[i+1].x=a;
            bl[i+1].y=c;
            bl[i+1].height=b;

            bl[i+2].x=b;
            bl[i+2].y=c;
            bl[i+2].height=a;
        }
        bl[0].x=bl[0].y=bl[0].height=0;
        sort(bl,bl+3*n+1,comp);
        for(i=1;i<=3*n;i++)
        {
            max=0;
            for(j=0;j<i;j++)
            {
                if(bl[i].x>bl[j].x && bl[i].y>bl[j].y && bl[j].height>max)
                    max=bl[j].height;
            }
            bl[i].height+=max;
        }

        max=0;
        for(i=1;i<=3*n;i++)
            if(bl[i].height>max)
                max=bl[i].height;

        cout<<"Case "<<count<<": maximum height = "<<max<<endl;
        count++;
    }
    return 0;
}

 

你可能感兴趣的:(ZOJ)