HDU1069 最長單調子序列變形

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 個長方體之上 )


代碼如下 :


發佈了68 篇原創文章 · 獲贊 5 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章