`
Simone_chou
  • 浏览: 192515 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

Monkey and Banana(DP)

 
阅读更多

Monkey and Banana

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7416    Accepted Submission(s): 3813


Problem Description
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
The input file will contain one or more test cases. The first line of each test case contains an integer n,
representing the number of different blocks in the following data set. The maximum value for n is 30.
Each of the next n lines contains three integers representing the values xi, yi and zi.
Input is terminated by a value of zero (0) for n.
 

 

Output
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 "Case case: 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 (n <= 30),代表给出 n 种长方体,给出每个长方体的三个长度,可以任意摆放任意使用多个,问叠放起来的最高高度是多少,输出最高的高度。底部的两边必须严格小于下面的底部才能往上叠放。

 

     思路:

     DP。类似于矩形嵌套的变形。找最长上升子序列。将一个长方体拆开六种来判断即可,dp[ i ] 表示到第 i 个长方体的最高高度是多少。

 

     AC:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef struct { int l, w, h; } node;

node num[200];
int ans, dp[200];

bool cmp (node a, node b) {
    if (a.l != b.l) return a.l > b.l;
    if (a.w != b.w) return a.w > b.w;
    return a.h > b.h;
}

int main() {

    int n, t = 0;
    while (~scanf("%d", &n) && n) {
        ans = 0;
        memset(dp, 0, sizeof(dp));

        while (n--) {
            int a, b, c;
            scanf("%d%d%d", &a, &b, &c);
            num[ans].l = a, num[ans].w = b, num[ans++].h = c;
            num[ans].l = a, num[ans].w = c, num[ans++].h = b;
            num[ans].l = b, num[ans].w = a, num[ans++].h = c;
            num[ans].l = b, num[ans].w = c, num[ans++].h = a;
            num[ans].l = c, num[ans].w = a, num[ans++].h = b;
            num[ans].l = c, num[ans].w = b, num[ans++].h = a;
        }

        sort(num, num + ans, cmp);

        int max_high = 0;
        dp[0] = num[0].h;
        for (int i = 1; i < ans; ++i) {
            int max_temp = 0;
            for (int j = 0; j < i; ++j) {
                if (num[j].l > num[i].l &&
                    num[j].w > num[i].w)
                    max_temp = max(max_temp, dp[j]);
            }
            dp[i] = max_temp + num[i].h;

            max_high = max(max_high, dp[i]);
        }

        printf("Case %d: maximum height = %d\n", ++t, max_high);
    }

    return 0;
}

 

 

分享到:
评论

相关推荐

    Monkey-banana-catch

    "Monkey-banana-catch" 是一个以JavaScript为基础的项目,可能是一个互动游戏或一个练习,其中猴子(Monkey)尝试抓住香蕉(Banana)。在这个场景中,JavaScript将用于实现动态的用户界面、游戏逻辑和交互功能。让...

    Monkey Banana-crx插件

    Monkey Banana-crx插件是一款专为英语用户设计的浏览器扩展程序,它的主要功能是在用户打开新的浏览器标签页时,展示一只可爱的小猴子以及它带来的激励人心的名言。这款插件旨在通过趣味性和正能量的方式,为用户的...

    JSU_动态规划_dp1

    最基础的DP题目解题报告,适合初学者!动态规划(DP1) ...解题报告: 1001 计算直线的交点数 1002 FatMouse's Speed1003 Common ... 1006 免费馅饼 1007 Humble Numbers1008 Monkey and Banana 1009 龟兔赛跑 1010 数塔

    中班英语:Banana and peach.doc

    中班英语:Banana and Peach教学设计 本文旨在设计一堂以bananapeach为主题的英语教学活动,旨在帮助中班学生学习新的英语单词和短语,培养学生的语言能力和实践能力。 教学目标 1. 学会新的英语单词:banana和...

    monkey指定页面测试

    在Android应用开发中,Monkey测试是一种自动化测试方法,主要用于检测应用程序的稳定性、健壮性和性能。Monkey测试通过发送随机的用户事件(如触摸、按键、滚动等)到应用程序,以此来模拟用户的各种操作,帮助...

    利用 Monkey 命令操作屏幕快速滑动

    一、Monkey测试简介 Monkey测试是Android平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常。 二、Monkey程序介绍...

    Tampermonkey CRX 4.18.0.zip

    Tampermonkey是一款非常著名的浏览器扩展,它以强大的用户脚本管理功能著称。CRX是Chrome Extension(Chrome扩展)的缩写,是谷歌浏览器用来安装和分发扩展程序的文件格式。Tampermonkey CRX 4.18.0.zip是一个包含...

    Tampermonkey-4.19.0

    名称:Tampermonkey----------------------------------------版本:4.19.0作者:TamperMonkey.net分类:其他----------------------------------------概述:The world's most popular userscript manager描述:...

    MonkeyBanana

    《MonkeyBanana》是一款由Dominic Pfister和Elia Perenzin共同开发的游戏项目,它主要使用Java编程语言实现。Java是一种广泛应用于各种平台的、面向对象的编程语言,具有跨平台、安全性高、可移植性强等特性。在这个...

    Monkey测试结果分析

    l monkey --pkg-whitelist-file /data/local/tmp/whitelist.txt --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v...

    基于python的monkey自动化脚本

    【Python的Monkey自动化脚本】 Monkey测试是一种模拟用户随机操作的应用程序稳定性测试方法,它通过发送大量的随机事件(如点击、滑动、按键等)到Android应用,来检测应用程序在极端或不可预见的用户交互下的行为...

    浏览器插件 Tampermonkey 4.13 ctx

    **Tampermonkey 4.13 ctx:浏览器脚本管理器的详解** Tampermonkey 是一款广受欢迎的浏览器扩展,尤其对于技术爱好者和开发者来说,它是一个不可或缺的工具。这款插件允许用户在他们的浏览器中引入自定义的 ...

    linux下支持触屏,按键功能的monkey程序,系统稳定性测试工具

    Monkey程序就是为了解决这个问题而设计的一种自动化测试工具。本篇将详细介绍Linux环境下Monkey程序的功能、工作原理以及如何利用它进行系统稳定性测试。 **Monkey程序的起源与功能** Monkey程序最初源于Android...

    Tampermonkey v4.7.0离线插件.zip

    Tampermonkey是一款强大的浏览器扩展,尤其对于IT专业人士和开发者来说,它是不可或缺的工具之一。这款插件的主要功能是管理和运行用户脚本,极大地提升了浏览体验和网页应用的自定义程度。用户脚本是一种可以在网页...

    Line 6 Monkey

    Line 6 Monkey

    学习Monkey使用说明

    1、 Monkey测试简介 Money是Android中的一个命令行工具,可以运行在模拟器里或实际设备中它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。 Monkey测试...

    基于python开发的monkey自动化工具

    【基于Python开发的Monkey自动化工具】是一种用于Android应用稳定性测试的有效方法,尤其适合初学者进行实践和学习。Monkey工具最初由Android系统提供,主要用于通过模拟用户随机事件来检测应用程序的稳定性和性能。...

    用Python 编写的一个Monkey脚本例子

    Python Monkey脚本是一种在自动化测试中广泛使用的工具,主要用于模拟用户对应用程序的随机或有目的性的操作。Monkey测试通常用于找出软件中的不稳定因素,比如内存泄漏、崩溃等问题。在这个例子中,我们将深入探讨...

Global site tag (gtag.js) - Google Analytics