/*題意:給出n種箱子的3邊長,每種箱子有無窮個,你可以選擇任意兩條邊作為底面,疊在上面的箱子的地面的長寬必須嚴格小於下面的箱子,問能夠到達的最大高度 解析:枚舉每一种放置的形狀,排序預先處理,DP求最大高度 */#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cmath>#include<cstring>using namespace std;#define manx 2000struct node{ int a,b,c;}x[manx];int dp[manx];bool comp(const node &x,const node &y){ return x.a<y.a || x.a==y.a && x.b<y.b;}int main(){ int n,ca=1; while(cin>>n,n){ int num=0,a,b,c; memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++){ scanf("%d%d%d",&a,&b,&c); x[num].a = a; x[num].b = b; x[num++].c = c; x[num].a = a; x[num].b = c; x[num++].c = b; x[num].a = b; x[num].b = c; x[num++].c = a; x[num].a = b; x[num].b = a; x[num++].c = c; x[num].a = c; x[num].b = a; x[num++].c = b; x[num].a = c; x[num].b = b; x[num++].c = a; } sort(x,x+num,comp); dp[0] = x[0].c; for(int i=1;i<num;i++){//// dp[i] = x[i].c; for(int j=0;j<i;j++){////注意迴圈的意義 if(x[i].a>x[j].a && x[i].b>x[j].b && dp[j]+x[i].c>dp[i]) ///// dp[i] = dp[j]+x[i].c; } } int ans = 0; for(int i=0;i<num;i++){ if(ans < dp[i]) ans = dp[i]; } printf("Case %d: maximum height = %d\n",ca++,ans); }}