DP[i]表示以i为最高点箱子的最大值
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
struct node
{
int l,w,h;
node(int l,int w,int h)
{
this->l=l;
this->w=w;
this->h=h;
}
bool operator<(const node &a) const
{
if(l>a.l)
return 1;
if(l==a.l)
return w>a.w;
return 0;
}
};
int main()
{
//ios::sync_with_stdio(false);
int n;
int t=0;
while(cin>>n)
{
if(n==0)
break;
vector<node> box;
while(n--)
{
int l,w,h;cin>>l>>w>>h;
box.emplace_back(l,w,h);
box.emplace_back(w,l,h);
box.emplace_back(h,w,l);
box.emplace_back(w,h,l);
box.emplace_back(l,h,w);
box.emplace_back(h,l,w);
}
sort(box.begin(),box.end());
int len=box.size();
vector<int> dp(len,0);//以这个为顶的最高长度
dp[0]=box[0].h;
for(int i=1;i<len;i++)
{
dp[i]=box[i].h;
for(int j=0;j<i;j++)
if(box[j].l>box[i].l&&box[j].w>box[i].w)
dp[i]=max(dp[i],dp[j]+box[i].h);
}
int ans=*max_element(dp.begin(),dp.end());
t++;
cout<<"Case "<<t<<": maximum height = "<<ans<<'\n';
}
return 0;
}