hdu 1069
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1069
题意:给定若干个木块长宽高,长宽高可以自己调整,求堆积起来最高的高度。
mark:枚举所有木块长宽高可能情况,简单dp。
代码:
#include <stdio.h> #include <stdlib.h> typedef struct { int x,y,z; }block; int cmp1(const void *a, const void *b) { block *p = (block *)a, *q = (block *)b; if(p->x != q->x) return q->x - p->x; return q->y - p->y; } int cmp2(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { block b[100]; int n,m,dp[100],a[3]; int i,j,k,max; k = 0; while(scanf("%d", &n), n) { for(i = m = 0; i < n; i++) { scanf("%d%d%d", a, a+1, a+2); qsort(a, 3, 4, cmp2); if(a[0] == a[1] && a[0] == a[2]) { b[m].x = b[m].y = b[m].z = a[0]; m++; } else if(a[0] == a[1]) { b[m].x = a[2]; b[m].y = b[m].z = a[0]; m++; b[m].x = b[m].y = a[0]; b[m++].z = a[2]; } else if(a[1] == a[2]) { b[m].x = b[m].z = a[1]; b[m].y = a[0]; m++; b[m].x = b[m].y = a[1]; b[m++].z = a[0]; } else { b[m].x = a[2]; b[m].y = a[1]; b[m++].z = a[0]; b[m].x = a[2]; b[m].y = a[0]; b[m++].z = a[1]; b[m].x = a[1]; b[m].y = a[0]; b[m++].z = a[2]; } } qsort(b, m, sizeof(b[0]), cmp1); for(i = max = 0; i < m; i++) { dp[i] = b[i].z; for(j = 0; j < i; j++) if(b[i].x < b[j].x && b[i].y < b[j].y) if(dp[i] < dp[j]+b[i].z) dp[i] = dp[j]+b[i].z; if(max < dp[i]) max = dp[i]; } printf("Case %d: maximum height = %d\n", ++k, max); } return 0; }