1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include
23 #include
24 using namespace std;
25 const int N=200;
26 int dir[6][3]={{0,1,2},{0,2,1},{1,0,2},{1,2,0},
27 {2,0,1},{2,1,0}};
28 struct Block
29 {
30 int x,y,z;
31 bool operator < (const Block &b) const
32 { return x>b.x||x==b.x&&y>b.y||x==b.x&&y==b.y&&z>b.z; }
33 };
34 Block b[N];
35 int ans[N];
36 int num;
37 bool Init()
38 {
39 int n;
40 int a[3];
41 num=0;
42 scanf("%d",&n);
43 if(n==0)
44 return false;
45 for(int i=0;i<n;i++)
46 {
47 scanf("%d %d %d",&a[0],&a[1],&a[2]);
48 for(int k=0;k<6;k++)
49 {
50 b[num].x=a[dir[k][0]];
51 b[num].y=a[dir[k][1]];
52 b[num].z=a[dir[k][2]];
53 num++;
54 }
55 }
56 return true;
57 }
58 int DP()
59 {
60 sort(b,b+num);
61 memset(ans,0,sizeof(ans));
62 ans[0]=b[0].z;
63 int Max;
64 for(int i=1;i<num;i++)
65 {
66 Max=0;
67 for(int j=0;j<i;j++)
68 {
69 if(b[j].x>b[i].x&&b[j].y>b[i].y&&Max<ans[j])
70 Max=ans[j];
71 }
72 ans[i]=Max+b[i].z;
73 }
74 Max=0;
75 for(int i=0;i<num;i++)
76 if(ans[i]>Max)
77 Max=ans[i];
78 return Max;
79 }
80 int main()
81 {
82 int t=1;
83 while(Init())
84 {
85 printf("Case %d: maximum height = %d\n",t++,DP());
86 }
87 }