zoukankan      html  css  js  c++  java
  • Day9

    一组研究人员正在设计一项实验,以测试猴子的智商。他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子。如果猴子足够聪明,它应当能够通过合理的放置一些砖块建立一个塔,并爬上去吃他们最喜欢的香蕉。
     
    研究人员有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 
     
    思路:题意说无限砖头,但限制了长宽以后,将每一块砖头的6种加入候选,变成了有限制类型的01背包问题,dp[i]表示以i为最底层能到达的最大高度,其转移方程为dp[i] = max(dp[i], dp[j]+high[i])(j为满足长宽小于i的砖头)
    const int maxm = 200;
    
    struct Node {
        int x, y, z;
        bool operator<(const Node &a) const {
            return x < a.x || (x == a.x && y < a.y);
        }
    } Nodes[maxm];
    
    int dp[maxm];
    
    int main() {
        ios::sync_with_stdio(false), cin.tie(0);
        int n, t1, t2, t3, cnt, kase = 0;
        while(cin >> n && n) {
            cnt = 0;
            for(int i = 1; i <= n; ++i) {
                cin >> t1 >> t2 >> t3;
                Nodes[++cnt] = Node{t1, t2, t3};Nodes[++cnt] = Node{t2, t3, t1};Nodes[++cnt] = Node{t3, t1, t2};
                Nodes[++cnt] = Node{t1, t3, t2};Nodes[++cnt] = Node{t2, t1, t3};Nodes[++cnt] = Node{t3, t2, t1};
            }
            sort(Nodes+1, Nodes+1+cnt);
            memset(dp, 0, sizeof(dp));
            for(int i = 1; i <= cnt; ++i) {
                dp[i] = Nodes[i].z;
                for(int j = 1; j < i; ++j)
                    if(Nodes[i].x > Nodes[j].x && Nodes[i].y > Nodes[j].y)
                        dp[i] = max(dp[i], dp[j]+Nodes[i].z);
            }
            int ans = -1;
            for(int i = 1; i <= cnt; ++i) ans = max(ans, dp[i]);
            cout << "Case " << ++kase << ": maximum height = " << ans << "
    ";
        }    
        return 0;
    }
    View Code
  • 相关阅读:
    JSP自定义标签
    Java集合之Arrays 剖析
    关于Java8中的Comparator那些事
    关于Comparable和Comparator那些事
    浅析Thread的join() 方法
    多线程的具体实现
    如何实现 List 集合的线程安全
    集合使用 Iterator 删除元素
    Tomcat目录详解
    一文读懂微服务架构
  • 原文地址:https://www.cnblogs.com/GRedComeT/p/12237733.html
Copyright © 2011-2022 走看看