#include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int INF=0x3f3f3f3f; struct node{ int l,s,h; }; vector<node>v; //按照长宽排序 bool cmp(node a,node b) { if(a.l==b.l) return a.s<b.s; return a.l<b.l; } int dp[200]; int main() { int n,kase; kase=0; while(cin>>n&&n) { int a,b,c; kase++; v.clear(); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) { cin>>a>>b>>c; v.push_back({a,b,c}); v.push_back({a,c,b}); v.push_back({b,a,c}); v.push_back({b,c,a}); v.push_back({c,a,b}); v.push_back({c,b,a}); } sort(v.begin(),v.end(),cmp); int cmax=-INF; for(int i=0;i<v.size();i++) { //以哪一块为底部 dp[i]=v[i].h; for(int j=i-1;j>=0;j--) if(v[j].l<v[i].l&&v[j].s<v[i].s) dp[i]=max(dp[i],dp[j]+v[i].h); cmax=max(cmax,dp[i]); } cout<<"Case "<<kase<<": maximum height = "<<cmax<<endl; } return 0; }