程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> HDU 1069 Monkey and Banana(LIS最長上升子序列),hdulis

HDU 1069 Monkey and Banana(LIS最長上升子序列),hdulis

編輯:關於C語言

HDU 1069 Monkey and Banana(LIS最長上升子序列),hdulis


B - LIS Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u  

Description

一組研究人員正在設計一項實驗,以測試猴子的智商。他們將掛香蕉在建築物的屋頂,同時,提供一些磚塊給這些猴子。如果猴子足夠聰明,它應當能夠通過合理的放置一些磚塊建立一個塔,並爬上去吃他們最喜歡的香蕉。   研究人員有n種類型的磚塊,每種類型的磚塊都有無限個。第i塊磚塊的長寬高分別用xi,yi,zi來表示。 同時,由於磚塊是可以旋轉的,每個磚塊的3條邊可以組成6種不同的長寬高。   在構建塔時,當且僅當A磚塊的長和寬都分別小於B磚塊的長和寬時,A磚塊才能放到B磚塊的上面,因為必須留有一些空間讓猴子來踩。   你的任務是編寫一個程序,計算猴子們最高可以堆出的磚塊們的高度。

Input

輸入文件包含多組測試數據。 每個測試用例的第一行包含一個整數n,代表不同種類的磚塊數目。n<=30. 接下來n行,每行3個數,分別表示磚塊的長寬高。 當n= 0的時候,無需輸出任何答案,測試結束。

Output

對於每組測試數據,輸出最大高度。格式:Case 第幾組數據: maximum height = 最大高度

Sample Input

1 10 20 30 

6 8 10 
5 5 5 

1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 
7 7 7 

31 41 59 
26 53 58 
97 93 23 
84 62 64 
33 83 27 

Sample Output

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

題意:把給定的長方體疊加在一起,他們的長寬高可以隨意交換,疊加的條件是,上面一個長方體的長和寬都比下面長方體的長

和寬短;求這些長方體能疊加的最高的高度.(其中(3,2,1)可以擺放成(3,2,1)(3,1,2)、(2,1,3)等).在前面一句話看出來點什麼沒??沒有的話繼續往下看

思路:其實就是求最長的單調遞減序列。在長和寬的遞減下,求最大能得出的最大高度了。

 

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
struct node
{
    int l,w,h;
} a[111];
int dp[111];
int cmp(node a,node b)
{
    if(a.l>b.l) return 1;
    if(a.l==b.l&&a.w>b.w)  return 1;
    else return 0;
}
int main()
{
int b[3],t,n,k,sum,f=1;
    while(cin>>t&&t)
    {
        k=0;
        for(int i=0; i<t; i++)
        {
            cin>>b[0]>>b[1]>>b[2];
            sort(b,b+3);
//記住,這道題可以這麼想,長一定大於寬,不然就不叫長了,所以只要找到高的三種情況即可 a[k].l=b[2]; a[k].w=b[1]; a[k].h=b[0]; //每個長方體最小的高 k++; a[k].l=b[2]; a[k].w=b[0]; a[k].h=b[1];//每個長方體第二高的高 k++; a[k].l=b[1]; a[k].w=b[0]; a[k].h=b[2];//每個長方體最高的高 k++; } sort(a,a+k,cmp); for(int i=0; i<k; i++) dp[i]=a[i].h; for(int i=k-2; i>=0; i--) //下一層 for(int j=i+1; j<k; j++) //上一層 { if(a[i].l>a[j].l&&a[i].w>a[j].w) //長和寬都要小於上一層的 if(dp[i]<dp[j]+a[i].h) //如果找到更大的高,就要更新 dp[i]=dp[j]+a[i].h; } sum=dp[0]; for(int i=0; i<k; i++) if(sum<dp[i]) sum=dp[i]; printf("Case %d: maximum height = %d\n",f++,sum); } return 0; }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved