UVa 437 - The Tower of Babylon
2012-04-04 14:59
423 查看
和之前的 Stacking Boxes 很像,但是这里求的是最大高度,并且盒子成了立体状,因此对每个盒子有三种不同的高度,分别为x, y, z,相当于增加两个盒子;
记忆化搜索。
记忆化搜索。
# include <stdio.h> # include <memory.h> typedef struct { int x; int y; int h; }block; int n; int f[91]; block b[91]; int cmp(const void *x, const void *y) { return (*(int *)x > *(int *)y ? 1:-1); } int dp(int i); int main() { int i, cnt, maxH, tmp, t[3]; cnt = 0; while (1) { ++cnt; scanf("%d", &n); if ( !n ) break; n *= 3; for ( i = 1; i <= n; ++i) { scanf("%d%d%d", &t[0], &t[1], &t[2]); qsort(t, 3, sizeof(int), cmp); b[i].x = t[0]; b[i].y = t[1]; b[i].h = t[2]; ++i; b[i].x = t[0]; b[i].y = t[2]; b[i].h = t[1]; ++i; b[i].x = t[1]; b[i].y = t[2]; b[i].h = t[0]; } maxH = 0; memset(f, 0, sizeof(f)); for ( i = 1; i <= n; ++i) if (maxH < (tmp = dp(i))) maxH = tmp; printf("Case %d: maximum height = %d\n", cnt, maxH); } return 0; } int dp(int i) { int j, tmp; if (f[i] > 0) return f[i]; f[i] = b[i].h; for ( j = 1; j <= n; ++j) { if (b[i].x>b[j].x && b[i].y>b[j].y && f[i] < (tmp = dp(j)+b[i].h)) f[i] = tmp; } return f[i]; }
相关文章推荐
- Uva 437-The Tower of Babylon(DP)
- UVA437 - The Tower of Babylon
- uva 437 The Tower of Babylon
- UVa 437 (变形的LIS) The Tower of Babylon
- UVa 437 The Tower of Babylon
- UVA 437 The Tower of Babylon
- UVa 437. The Tower of Babylon
- UVA 437 The Tower of Babylon(最长上升子序列)
- uva 437 The Tower of Babylon
- 【UVA 437】The Tower of Babylon(拓扑排序+DP,做法)
- UVA437- - The Tower of Babylon
- UVa 437 - The Tower of Babylon
- uva 437 - The Tower of Babylon
- uva 437 The Tower of Babylon (DAG)
- The Tower of Babylon UVA - 437
- UVA_437_The Tower of Babylon
- UVA 437 The Tower of Babylon
- UVA 437 - The Tower of Babylon (DAG)
- UVa 437 The Tower of Babylon(经典动态规划)
- UVA 437 The Tower of Babylon (dp + DAG最长序列)