题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069
题目大意:把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长和宽短;求这些长方体能叠加的最高的高度.(其中(3,2,1)可以摆放成(3,1,2)、(2,1,3)等).

思路:把面积排序,求最长的单调递减序列(递减的条件:上面的长方体长宽都小于下面的长方体长宽)。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define LL long long
#define p1 first
#define p2 second
//memset(a, 0, sizeof(a));
//stack堆栈 queue队列 priority_queue优先队列
//vector向量 multiset平衡二叉树 deque双端队列
//pair{T1 first;T2 second;} greater<T>
//unordered_map 哈希map
struct NODE
{
    int x;
    int y;
    int h;
    int s;

}a[300];

int cmp(NODE &a, NODE &b)
{
    return a.s>b.s;
}

int main()
{
    int n, cut=0;
    while(~scanf("%d",&n))
    {
        cut++;
        if(n==0)
        {
            return 0;
        }
        int p=1;
        for(int i=0;i<n;i++)
        {
            int x, y, z;
            scanf("%d%d%d",&x,&y,&z);
            a[p].x=x, a[p].y=y, a[p].h=z, a[p++].s=x*y;
            a[p].x=x, a[p].y=z, a[p].h=y, a[p++].s=x*z;
            a[p].x=y, a[p].y=z, a[p].h=x, a[p++].s=y*z;
        }
        sort(a+1, a+p+1, cmp);

        LL dp[300]={0};
        for(int i=1;i<p;i++)
        {
            dp[i]=a[i].h;
            for(int j=1;j<i;j++)
            {
                if(a[i].x<a[j].x&&a[i].y<a[j].y||a[i].y<a[j].x&&a[i].x<a[j].y)
                {
                    dp[i]=max(dp[i], dp[j]+a[i].h);
                }
            }
        }
        cout<<"Case "<<cut<<": maximum height = "<<*max_element(dp+1, dp+p+1)<<endl;

    }

    return 0;
}