题目链接: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;
}