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

Monkey and Banana

直接写中文了

Problem Statement

一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。
 
研究人员有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
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 

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

题目链接:

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)

上面的砖头长(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;
}
复制代码

 

 

 

posted on   Sky丨Star  阅读(1296)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示