UVA 437 The Tower of Babylon
2011-11-06 22:03
411 查看
UVA_437
首先将一个长方体变成3个来存储,然后按底面积的大小升序排列,最后求一个最长上升子序列即可。
首先将一个长方体变成3个来存储,然后按底面积的大小升序排列,最后求一个最长上升子序列即可。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXD 110 int N, f[MAXD], a[5][MAXD], r[MAXD]; int cmp(const void *_p, const void *_q) { int *p = (int *)_p; int *q = (int *)_q; return a[0][*p] * a[1][*p] - a[0][*q] * a[1][*q]; } int init() { int i; scanf("%d", &N); if(!N) return 0; N *= 3; for(i = 0; i < N; i ++) { scanf("%d%d%d", &a[0][i], &a[1][i], &a[2][i]); i ++; a[2][i] = a[0][i - 1], a[0][i] = a[1][i - 1], a[1][i] = a[2][i - 1]; i ++; a[2][i] = a[0][i - 1], a[0][i] = a[1][i - 1], a[1][i] = a[2][i - 1]; } return 1; } void solve() { int i, j, ri, rj, temp, max; for(i = 0; i < N; i ++) r[i] = i; qsort(r, N, sizeof(r[0]), cmp); for(i = 0; i < N; i ++) f[i] = a[2][r[i]]; for(i = 1; i < N; i ++) { ri = r[i]; for(j = 0; j < i; j ++) { rj = r[j]; if((a[0][rj] < a[0][ri] && a[1][rj] < a[1][ri]) || (a[0][rj] < a[1][ri] && a[1][rj] < a[0][ri])) { temp = f[j] + a[2][ri]; if(temp > f[i]) f[i] = temp; } } } max = 0; for(i = 0; i < N; i ++) if(f[i] > max) max = f[i]; printf("%d\n", max); } int main() { int t = 0; while(init()) { printf("Case %d: maximum height = ", ++ t); solve(); } return 0; }
相关文章推荐
- UVA 437 The Tower of Babylon
- The Tower of Babylon UVA - 437
- UVA437 The Tower of Babylon
- UVA 437 The Tower of Babylon - 简单dp
- UVA 437 The Tower of Babylon
- UVa--437 The Tower of Babylon(dp)
- UVa 437 - The Tower of Babylon LIS
- UVA 437 The Tower of Babylon DP
- uva437 - The Tower of Babylon
- uva 437 The Tower of Babylon(dp,记忆化搜索)
- UVa 437 - The Tower of Babylon(DP)
- UVa - 437 - The Tower of Babylon
- uva 437 The Tower of Babylon
- UVa 437 - The Tower of Babylon LIS
- 【动态规划】[UVA 437]The Tower of Babylon
- UVa437 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)详细题解