【HDU - 1069】 Monkey and Banana (基礎dp)

Monkey and Banana

直接寫中文了node

Problem Statementc++

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

Input測試

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

Outputspa

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

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

Sample Output code

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

題目連接:blog

https://vjudge.net/problem/HDU-1069

排序

一塊磚頭有6種方式去擺放(1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1)ci

上面的磚頭長(l) ,寬(s)必須分別小於下面的

dp[i]爲第i個磚頭是最下面的那個磚頭時候 能夠達到的最大高度

AC代碼

#include <bits/stdc++.h>
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x, y) memset(x, y, sizeof(x))
#define Maxn 1000
using namespace std;
struct node
{
    int l,s,h;//長 寬 高
    node(int l,int s,int h):l(l),s(s),h(h) {}
    bool operator<(const node &c)const//從小到大排序
    {
        if(l==c.l)
            return s<c.s;
        return l<c.l;
    }

};
vector<node> v;
int dp[Maxn];
int main()
{
    int n,k=0;
    while(cin>>n&&n!=0)
    {
        k++;
        v.clear();//清空,初始化
        MEM(dp,0);
        int cnt=0;
        int a,b,c;
        for(int i=0; i<n; i++)
        {
            cin>>a>>b>>c;//依次存入
            v.push_back(node(a,b,c));
            v.push_back(node(a,c,b));
            v.push_back(node(b,a,c));
            v.push_back(node(b,c,a));
            v.push_back(node(c,b,a));
            v.push_back(node(c,a,b));
        }
        sort(v.begin(),v.end());//排序
        int ans=0;
        for(int i=0; i<v.size(); i++)//從最小的那塊磚開始
        {
            dp[i]=v[i].h;//一開始以就這一塊磚頭,dp[i]=v[i].h
            for(int j=i-1; j>=0; j--)//開始往上找比它小的磚頭
            {
                //第j塊磚頭的長、寬分別比第i塊小,且以第j塊磚頭爲底層的高度+第i塊磚的高度 大於 以第i塊磚爲底層的高度,則更新dp[i]
                if(v[j].l<v[i].l&&v[j].s<v[i].s&&dp[j]+v[i].h>dp[i])
                    dp[i]=dp[j]+v[i].h;
            }
            if(dp[i]>ans)
                ans=dp[i];
        }
        cout<<"Case "<<k<<": maximum height = "<<ans<<endl;
    }
    return 0;
}
相關文章
相關標籤/搜索