Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> zoj1093題解 Monkey and Banana

zoj1093題解 Monkey and Banana

編輯:關於Android編程

Monkey and Banana

Time Limit: 2 Seconds Memory Limit: 65536 KB

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 Specification

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

Output Specification

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 "Casecase: 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

題目大意:n個磚塊,以層疊的方式堆起來,求能堆的最大高度,限制條件是,位於上面的磚塊兩條邊必須小於下面的磚塊,給猴子留位置攀登。

思路:

這個問題是典型的DAG圖的dp問題,由於磚塊每種都是無限的,並且可以隨意放,可以將每種磚塊的三種擺放形式都當成,一種,這種共有3n個磚塊了,

該問題跟矩形嵌套問題類似,即求從編號i出發能堆出的最大的高度(不包括i磚塊),dp(i) = max(dp(j) + j的高度; j是能放在i上面的磚塊編號),算法設計不難,主要是很多細節問題,比較蛋疼,如將開始節點看成地板最大高度為無窮大,結果就為dp(0);

代碼如下:

#include
#include
#include
using namespace std;

int box[100][3];
int height[100];
int number;
//轉換磚塊為三種類型
void change(int index,int a,int b,int c)
{
     box[index][0] = a;
     box[index][1] = b;
     box[index][2] = c;
}
//dp
int DP(int j)
{
    int& ans = height[j];
    //搜索過直接返回
    if(ans != -1)return ans;
    
   //搜索每一層
    for(int i = 1; i <= number; i++)
    {
            if(i!=j)
            {
                 if((box[i][0] < box[j][0] && box[i][1] < box[j][1]) || 
                 (box[i][1] < box[j][0] && box[i][0] < box[j][1]))
                 {
                    int  temp = DP(i) + box[i][2];
                    if(temp > ans) ans = temp;       
                 }
            }
    }
    //未更新,說明是最後一層。
    if(ans == -1) ans = 0;
    return ans;
}
int main()
{
    
    int n;
    int Case = 0;
    while(cin >> n && n)
    {
        
        int a,b,c;
        number = 0;
    //地板看成無窮大磚塊。
        box[0][0] = box[0][1] = box[0][2] = INT_MAX;
    
        for(int i = 1; i <= n; i++)
        {
                cin >> a >> b >> c;
                change(++number,a,b,c);
                change(++number,b,c,a);
                change(++number,c,a,b);
        }
        
        for(int i = 0; i <= number; i++)
        {
                height[i] = -1;
        }
        cout << "Case " << ++Case << ": maximum height = " << DP(0) << endl;
    }
    return 0;
}



						
		
	
				
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved