#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
//状态定义:d[idx][h]
//现在是序列为idx的长方体,高h在idx中第几个 最多还能有多高(包括当前这个立方体)
int blocks[35][3],d[35][3],N;
int dp(int idx,int h)
{
int& ans=d[idx][h];
if(ans) return ans;
ans=0;
int p=0,v[2]; //v为现在长宽;
for(int i=0;i<3;i++)
if(i!=h) v[p++]=blocks[idx][i];
for(int i=0;i<N;i++)
{
int v2[3]; //v2为准备放上去的
memcpy(v2,blocks[i],sizeof(v2));
do{
if(v2[0]<v[0]&&v2[1]<v[1]) {
int h1=find(blocks[i],blocks[i]+3,v2[2])-blocks[i];
ans=max(ans,dp(i,h1));
}
}while(next_permutation(v2,v2+3));
}
ans+=blocks[idx][h]; //加上当前这一层的高度
return ans;
}
int main()
{
int kase=0;
while(scanf("%d",&N)&&N)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<3;j++)
cin>>blocks[i][j];
sort(blocks[i],blocks[i]+3);
}
int ans=0;
memset(d,0,sizeof(d));
for(int i=0;i<N;i++)
for(int h=0;h<3;h++)
ans=max(ans,dp(i,h));
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return 0;
}
UVA 437 The Tower of Babylon
最新推荐文章于 2022-11-27 16:31:35 发布