//Accepted 264 KB 0 ms //每种block只有三种方法,且每种放法至多放一次 //规定三条边的顺序后 //把所有的block按x递增排序,x相同则按y递增排序 //然后dp //dp[i]=max(dp[i],dp[j]+height[i]) i可以放到j上 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; ; struct node { int x,y,z; }p[*imax_n]; *imax_n]; int n; int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } void Dp() { memset(dp,,sizeof(dp)); ;i<=*n;i++) { ;j<i;j++) if (p[j].x<p[i].x && p[j].y<p[i].y) dp[i]=max(dp[i],dp[j]+p[i].z); } ; ;i<=*n;i++) ans=max(ans,dp[i]); printf("%d\n",ans); } int cmp(struct node p1,struct node p2) { ; if (p1.x==p2.x) { ; } ; } int main() { ; while (scanf("%d",&n),n) { ;i<=n;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); p[*i-].x=min(x,y); p[*i-].y=max(x,y); p[*i-].z=z; p[*i-].x=min(x,z); p[*i-].y=max(x,z); p[*i-].z=y; p[*i].x=min(y,z); p[*i].y=max(y,z); p[*i].z=x; } sort(p+,p+*n+,cmp); printf("Case %d: maximum height = ",++t); Dp(); } ; }