#include <cstdlib>
#include <iostream>
#define MAXN 30
#define MAX(a, b) a>b?a:b
#define MIN(a, b) a>b?b:a
using namespace std;
struct Block{
int w, l, h;
}blks[3*MAXN];
int n;
int nPos;
void Record(int h, int w, int l)
{
int i=0;
for (; i < nPos; i++)
{
if (w == blks[i].w && h == blks[i].h) break;
}
if (i == nPos)
{
blks[i].w = w; blks[i].h = h; blks[i].l = l;
nPos++;
}else if (blks[i].h < h) blks[i].h = h;
}
void Input()
{
nPos = 0;
int a, b, c;
for (int i = 0; i < n; i++)
{
cin>>a>>b>>c;
Record(a, MIN(b,c), MAX(b,c));
Record(b, MIN(a,c), MAX(a,c));
Record(c, MIN(a,b), MAX(a,b));
}
}
bool putable[3*MAXN][3*MAXN];
bool top[3*MAXN];
int ht[3*MAXN];
int Height(int i)
{
if (ht[i]) return ht[i];
ht[i] = blks[i].h;
if (top[i]) return ht[i];
int max=0, height;
for (int j = 0; j < nPos; j++)
{
if (putable[j][i])
{
height = Height(j);
if (height > max) max = height;
}
}
ht[i] += max;
return ht[i];
}
int MaxHeight()
{
for (int i = 0; i < nPos; i++)
for (int j = 0; j < nPos; j++)
{
if (blks[i].w < blks[j].w && blks[i].l < blks[j].l)
putable[i][j] = 1;
else putable[i][j] = 0;
}
for (int i = 0; i < nPos; i++)
{
top[i] = true;
for (int j = 0; j < nPos; j++)
{
if(putable[j][i]) top[i] = false;
}
}
for (int i = 0; i < nPos; i++) ht[i] = 0;//注意可能出错
int max = 0;
for (int i = 0; i < nPos; i++)
if (max < Height(i)) max = Height(i);
return max;
}
int main(int argc, char *argv[])
{
int t = 1;
while(1)
{
cin>>n;
if (n == 0) break;
Input(); cout<<"Case "<<t++<<": maximum height = "<<MaxHeight()<<endl; }
}
ZOJ 1093 Monkey and banana
最新推荐文章于 2020-01-27 10:07:07 发布