题意:给n种类型的箱子,每种类型提供无限的数量。要求把这些箱子尽量叠高,上一层箱子的长宽必须都比下一层的箱子小,求可以叠的最高高度。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 120
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) > (b) ? (b) : (a))
struct Block
{
int x, y, z;
Block() {}
void add(int _x, int _y, int _z)
{
z = _z;
x = MAX(_x, _y);
y = MIN(_x, _y);
}
bool operator <(const Block& rhs) const
{
return x < rhs.x && y < rhs.y;
}
} block[MAXN];
bool cmp(const Block& lhs, const Block& rhs)
{
if (lhs.x == rhs.x)
return lhs.y > rhs.y;
return lhs.x > rhs.x;
}
int F[MAXN];
int main()
{
int n, i, j, x, y, z, max, cases = 0;
while (scanf("%d", &n) != EOF && n)
{
for (i = 0; i < n; ++i)
{
scanf("%d%d%d", &x, &y, &z);
block[i*3].add(x, y, z);
block[i*3+1].add(x, z, y);
block[i*3+2].add(y, z, x);
}
n *= 3;
sort(block, block+n, cmp);
max = F[0] = block[0].z;
for (i = 1; i < n; ++i)
{
F[i] = block[i].z;
for (j = 0; j < i; ++j)
{
if (block[i] < block[j] && F[i] < F[j] + block[i].z)
F[i] = F[j] + block[i].z;
}
max = MAX(F[i], max);
}
printf("Case %d: maximum height = %d\n", ++cases, max);
}
return 0;
}