题目大意:给你N种箱子,给出它的长,宽,高;(每种箱子视为无限个)。把箱子叠层起来,问最大能叠多高。但要求的必须在上面一个箱子的长和宽都要比它下面的箱子的长和宽都小。
思路:其实就是求最长的单调递减序列。题目上说每种可以有无限个,那么就把N中类型的箱子都列举出来,全部进行比较。在长和宽的递减下,求最大能得出的最大高度了。
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct Block{
int l; // 长
int w; // 宽
int h; // 高
}Block;
int dp[110];// 当前最长长度
int n;
Block nBlocks[100];
int cnt = 0;
// 按升序排列
bool cmp(Block m, Block n)
{
return (m.l*m.w < n.l*n.w);
}
// 如果n放m上面
bool is(Block m, Block n)
{
return (m.l>n.l && m.w>n.w) || (m.l>n.w && m.w>n.l);
}
int main()
{
int a, b, c;
int temp;
while(scanf("%d", &n) && n)
{
++cnt;
for(int i=0; i<3*n; ++i)
{
scanf("%d %d %d", &a, &b, &c);
//cout << a << " " << b << " " << c << endl;
nBlocks[i].l=a, nBlocks[i].w=b, nBlocks[i].h=c, ++i;
nBlocks[i].l=b, nBlocks[i].w=c, nBlocks[i].h=a, ++i;
nBlocks[i].l=c, nBlocks[i].w=a, nBlocks[i].h=b;
}
sort(nBlocks, nBlocks+3*n, cmp);
for (int i=0; i<3*n; ++i)//注意初始化
dp[i]= nBlocks[i].h;
for(int i=1; i<3*n; ++i)
{
for(int j=0; j<i; ++j)
{
if(is(nBlocks[i], nBlocks[j]))
dp[i] =max(dp[j]+nBlocks[i].h,dp[i]);
}
}
temp = 0;
for(int i=0; i<3*n; ++i)
{
if(dp[i] > temp)
temp = dp[i];
}
printf("Case %d: maximum height = %d\n", cnt, temp);
}
return 0;
}