Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
思路:首先,每个方块的三个维度一共有3*2=6中组合,题目说最多有30个方块,所以数组应该开180以上。思路是DP数组的每个元素存的是以此方块为底的最高能摆的高度,从最顶端那个开始填表,顺便记录下最大值,最后输出最大值即可。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #define MAX 200
5
6 struct x
7 {
8 int x;
9 int y;
10 int z;
11 }DP[MAX];
12
13 int comp(const void * a,const void * b);
14 int main(void)
15 {
16 int n,max,box,x,y,z,count;
17 count = 0;
18
19 while(scanf("%d",&n) && n)
20 {
21 count ++;
22 for(int i = 0;i < 6 * n;i ++)
23 {
24 scanf("%d%d%d",&x,&y,&z);
25 DP[i].x = x;
26 DP[i].y = y;
27 DP[i].z = z;
28
29 i ++;
30 DP[i].x = x;
31 DP[i].y = z;
32 DP[i].z = y;
33
34 i ++;
35 DP[i].x = z;
36 DP[i].y = y;
37 DP[i].z = x;
38
39 i ++;
40 DP[i].x = z;
41 DP[i].y = x;
42 DP[i].z = y;
43
44 i ++;
45 DP[i].x = y;
46 DP[i].y = x;
47 DP[i].z = z;
48
49 i ++;
50 DP[i].x = y;
51 DP[i].y = z;
52 DP[i].z = x;
53 }
54 qsort(DP,6 * n,sizeof(struct x),comp);
55
56 max = DP[6 * n - 1].z;
57 for(int i = 6 * n - 2;i >= 0;i --)
58 {
59 box = 0;
60 for(int j = i + 1;j < 6 * n - 1;j ++)
61 if(DP[i].x > DP[j].x && DP[i].y > DP[j].y && box < DP[j].z)
62 box = DP[j].z;
63 DP[i].z += box;
64 max = max > DP[i].z ? max : DP[i].z;
65 }
66 printf("Case %d: maximum height = %d\n",count,max);
67 }
68
69 return 0;
70 }
71
72 int comp(const void * a,const void * b)
73 {
74 return -(((struct x *)a) -> x - ((struct x *)b) -> x);
75 }