1 10 20 30 2 6 8 10 5 5 5 7 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 5 31 41 59 26 53 58 97 93 23 84 62 64 33 83 27 0
Case 1: maximum height = 40 Case 2: maximum height = 21 Case 3: maximum height = 28 Case 4: maximum height = 342
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 10010; 4 struct Cube{ 5 int x,y,z; 6 Cube(int a = 0,int b = 0,int c = 0){ 7 x = a; 8 y = b; 9 z = c; 10 } 11 bool operator<(const Cube &t) const{ 12 return x*y > t.x*t.y; 13 } 14 }cube[maxn]; 15 int dp[maxn]; 16 int main(){ 17 int n,tot,x,y,z,kase = 1; 18 while(scanf("%d",&n),n){ 19 for(int i = tot = 0; i < n; ++i){ 20 scanf("%d%d%d",&x,&y,&z); 21 cube[tot++] = Cube(x,y,z); 22 cube[tot++] = Cube(y,z,x); 23 cube[tot++] = Cube(x,z,y); 24 } 25 memset(dp,0,sizeof dp); 26 sort(cube,cube+tot); 27 int maxHeight = 0; 28 for(int i = 0; i < tot; ++i){ 29 dp[i] = cube[i].z; 30 for(int j = i-1; j >= 0; --j){ 31 if(cube[j].x > cube[i].x && cube[j].y > cube[i].y) 32 dp[i] = max(dp[i],dp[j] + cube[i].z); 33 if(cube[j].y > cube[i].x && cube[j].x > cube[i].y) 34 dp[i] = max(dp[i],dp[j] + cube[i].z); 35 } 36 maxHeight = max(maxHeight,dp[i]); 37 } 38 printf("Case %d: maximum height = %d\n",kase++,maxHeight); 39 } 40 return 0; 41 }