类似于求最长递减子序列,这里对每个输入的立方体都构造为6个。height[i]表示第i个立方体放入后所能够达到的最大高度
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX(a,b) (a>b?a:b)
#define LEN 200
typedef struct Node {
int x, y, z;
}Node;
Node node[LEN];
int height[LEN];
int cmp(const void* a, const void* b) {
return ((Node*)b)->x-((Node*)a)->x;
}
void oriente(int number, int x, int y, int z) {
node[number].x = x;
node[number].y = y;
node[number].z = z;
}
int main() {
int num, index;
index = 1;
while(scanf("%d", &num), num != 0) {
int x, y, z;
int i, j, max, ans;
int number = 0;
memset(height, 0, sizeof(height));
for(i = 0; i < num; i++) {
scanf("%d%d%d", &x, &y, &z);
oriente(number++, x, y, z);
oriente(number++, x, z, y);
oriente(number++, y, x, z);
oriente(number++, y, z, x);
oriente(number++, z, x, y);
oriente(number++, z, y, x);
}
num *= 6;
qsort(node, num, sizeof(Node), cmp); // 这里sizeof(Node)写成了sizeof(node)出错了好几次
for(i = 0; i < num; i++) {
height[i] = node[i].z;
}
ans = 0;
for(i = 0; i < num; i++) {
max = 0;
for(j = i-1; j >= 0; j--) {
if(node[i].x < node[j].x && node[i].y < node[j].y && max < height[j]) {
max = height[j];
}
}
height[i] += max;
if(ans < height[i]) {
ans = height[i];
}
}
printf("Case %d: maximum height = %d\n", index++, ans);
}
return 0;
}