Monkey and Banana
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1907 Accepted Submission(s): 986
Problem Description
A group of researchers are designing an experiment to
test the IQ of a monkey. They will hang a banana at the roof of a building, and
at the mean time, provide the monkey with some blocks. If the monkey is clever
enough, it shall be able to reach the banana by placing one block on the top
another to build a tower and climb up to get its favorite food.
The researchers have 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 want to make sure that the tallest tower possible by stacking blocks can
reach the roof. The problem is 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 because there has to be some space for the monkey to step
on. 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 monkey can build with a given set of blocks.
Input
The input file 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
題目要求是 , 把給定尺寸的長方體 ( 數量不限 ) 疊在一起 , 能疊加的條件是 , 上面一個長方體的長寬比下面一個長方體的長寬短都短 , 或者一邊相等 , 另一邊較短 , 長方體可以任意麪朝下襬放 , 求這些長方體能夠疊成的最高的高度 .
不難看出 , 這題和最長遞減子序列很相似 . 可以用類似的思路求解 .
首先對各種尺寸的長方體不同面朝下的各種擺法按照地面的長寬和麪積排序 , 排序後 , 保證排在前面的長方體的底面的長和寬都比下一個的要長 , 或者一邊相等 , 另一邊較長 , 並且前面的長方體的面積必定比後面的大 .
設 h[i] 爲前 i 個長方體中 , 包含第 i 個長方體的能夠擺放的最大高度 ,z[i] 爲第 i 個長方體的高 , 其轉移方程爲 :
h[i]=max(h[k])+z[i](1<=k<i, 且第 i 個長方體能擺在第 k 個長方體之上 )
代碼如下 :