POJ 2241 The Tower of Babylon

The Tower of Babylon

Time Limit: 1000ms

Memory Limit: 65536KB

This problem will be judged on PKU. Original ID: 2241
64-bit integer IO format: %lld      Java class name: Main

Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: 
The babylonians had n types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions (xi, yi, zi). A block could be reoriented so that any two of its three dimensions determined the dimensions of the base and the other dimension was the height. 
They wanted to construct the tallest tower possible by stacking blocks. The problem was that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly smaller than the corresponding base dimensions of the lower block. This meant, for example, that blocks oriented to have equal-sized bases couldn‘t be stacked.

Your job is to write a program that determines the height of the tallest tower the babylonians can build with a given set of blocks.

Input

The input will contain one or more test cases. The first line of each test case contains an integer n, 
representing the number of different blocks in the following data set. The maximum value for n is 30. 
Each of the next n lines contains three integers representing the values xi, yi and zi. 
Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line containing the case number (they are numbered sequentially starting from 1) and the height of the tallest possible tower in the format "Case case: maximum height = height"

Sample Input

1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0

Sample Output

Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342

Source

Ulm Local 1996

解题:动态规划,很像LIS

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 10010;
 4 struct Cube{
 5     int x,y,z;
 6     Cube(int a = 0,int b = 0,int c = 0){
 7         x = a;
 8         y = b;
 9         z = c;
10     }
11     bool operator<(const Cube &t) const{
12         return x*y > t.x*t.y;
13     }
14 }cube[maxn];
15 int dp[maxn];
16 int main(){
17     int n,tot,x,y,z,kase = 1;
18     while(scanf("%d",&n),n){
19         for(int i = tot = 0; i < n; ++i){
20             scanf("%d%d%d",&x,&y,&z);
21             cube[tot++] = Cube(x,y,z);
22             cube[tot++] = Cube(y,z,x);
23             cube[tot++] = Cube(x,z,y);
24         }
25         memset(dp,0,sizeof dp);
26         sort(cube,cube+tot);
27         int maxHeight = 0;
28         for(int i = 0; i < tot; ++i){
29             dp[i] = cube[i].z;
30             for(int j = i-1; j >= 0; --j){
31                 if(cube[j].x > cube[i].x && cube[j].y > cube[i].y)
32                     dp[i] = max(dp[i],dp[j] + cube[i].z);
33                 if(cube[j].y > cube[i].x && cube[j].x > cube[i].y)
34                     dp[i] = max(dp[i],dp[j] + cube[i].z);
35             }
36             maxHeight = max(maxHeight,dp[i]);
37         }
38         printf("Case %d: maximum height = %d\n",kase++,maxHeight);
39     }
40     return 0;
41 }

时间: 2024-12-06 01:41:43

POJ 2241 The Tower of Babylon的相关文章

POJ 2241 The Tower of Babylon(UVA 437)

多种方法,我用DP做的. 我当成的 最长下降子序列做的. 问了下其他人,有树形DP的,有差分约束用最短路的. 还有当作 二维的背包问题的. 最长单调子序列,长宽高 x,y,z 分别枚举成六个.然后排序,找最长单调子序列即可. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #inc

UVa 437 The Tower of Babylon

Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians had n typ

UVA The Tower of Babylon

The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians

UVA 437 The Tower of Babylon DP

有向图DAG The Tower of Babylon Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So n

uva437 - The Tower of Babylon(DAG上的DP)

题目:uva437 - The Tower of Babylon(DAG上的DP) 题目大意:给你一些立方体,给出长宽高XYZ.现在希望你将这些立方题叠起来,使得最后的高度最大,并且这些立方体是可以无限次使用的,但是一个立方体要在另一个立方体的上面的话是需要满足这个立方体的底面是可以完全包含在下面的那个立方体的底面. 解题思路:其实这里的无限次使用没有什么用,因为一个立方体最多使用三次就不可能是再用.输入的一个立方体其实可以变成三个确定长宽高的立体.然后将这些立方体先做预处理,如果立方体j能够放

POJ 2241 Mondriaan&#39;s Dream

题意:给一块n×m的空地,用1×2的砖铺,有多少种方案. 解法:状压dp.考虑dp[i][j]表示前i - 1行都铺满时第i行的状态为j时的方案数.对于第i行,每个格子上是否有砖用0和1表示,0表示不铺砖,1表示铺砖,二进制压缩状态,枚举第i - 1行的状态j和第i行的状态k,看这两种状态是否符合实际,如果符合实际,dp[i][k] += dp[i - 1][j].因为在看第i行时要求i - 1行都铺满,所以j状态中0的位置k都必须是1,表示放一块2×1的砖,剩下的部分如果k的位置是1,则是放了

UVA 437 十九 The Tower of Babylon

The Tower of Babylon Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 437 Appoint description:  System Crawler  (2015-08-29) Description Perhaps you have heard of the legend of the Tower of Babylon. No

UVa 437 The Tower of Babylon(动态规划)

传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians had n

POJ2241——The Tower of Babylon

The Tower of Babylon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2207   Accepted: 1244 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line