Monkey and Banana

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

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


Sample Output

Case : maximum height =
Case : maximum height =
Case : maximum height =
Case : maximum height =

题目大意

给出一些长方体的规格,每种长方体都有无限个,问利用这些长方体(长宽高可以转换),下层的长和宽都比上层的大,最多能堆多高

题目分析

虽说是无限多个,但是由于长和高堆起来都不能相等,所以一个规格的长方体最多能用6个(长宽高的不同排列),这样就将题目转化成了一个有限的木块的题目。

首先将木块按照x值与y值从大到小排序,用dp[i]来记录i为最顶端木块时,所能达到的最大高度。

由于我们已经将木块排好序了,那么处理到 i 木块时,能在这个木块底下的就只有 [0, i-1] 这些木块,所以用一个 j 从0循环到 i-1:

如果i的x和y小于j的x和y,那么dp[i]显然等于:max ( dp[j] + a[i].h , dp[i] )

求出dp[i]时,要注意更新结果。

代码

#include <bits/stdc++.h>  

using namespace std; 

typedef struct
{
int x;
int y;
int h;
}node;
node a[]; int i,n,num,x,y,z,t=,anss,dp[],j; bool cmp (node a,node b)
{
if(a.x>b.x)
return ;
else if(a.x==b.x&&a.y>b.y)
return ;
else return ;
} int main()
{
while(scanf("%d",&n),n!=)
{
t++;
memset(a,,sizeof(a));
num=;
for(i=;i<=n;i++)
{
scanf("%d %d %d",&x,&y,&z);
//cout<<x<<y<<z;
a[num].x=x,a[num].y=y,a[num].h=z;
num++;
a[num].x=y,a[num].y=x,a[num].h=z;
num++;
a[num].x=z,a[num].y=x,a[num].h=y;
num++;
a[num].x=z,a[num].y=y,a[num].h=x;
num++;
a[num].x=x,a[num].y=z,a[num].h=y;
num++;
a[num].x=y,a[num].y=z,a[num].h=x;
num++;
}
sort(a,a+num,cmp);
anss=;
memset(dp,,sizeof(dp));
for(i=;i<num;i++)
dp[i]=a[i].h;
for(i=;i<num;i++)
{
for(j=;j<i;j++)
{
if(a[i].x<a[j].x&&a[i].y<a[j].y)
dp[i]=max(dp[j]+a[i].h,dp[i]);
}
if(dp[i]>anss)
anss=dp[i];
}
printf("Case %d: maximum height = %d\n",t,anss);
}
}

HDU 1069 Monkey and Banana (动态规划、上升子序列最大和)的更多相关文章

  1. HDU 1069 Monkey and Banana dp 题解

    HDU 1069 Monkey and Banana 纵有疾风起 题目大意 一堆科学家研究猩猩的智商,给他M种长方体,每种N个.然后,将一个香蕉挂在屋顶,让猩猩通过 叠长方体来够到香蕉. 现在给你M种 ...

  2. HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径)

    HDU 1069 Monkey and Banana / ZOJ 1093 Monkey and Banana (最长路径) Description A group of researchers ar ...

  3. HDU 1069 Monkey and Banana(转换成LIS,做法很值得学习)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 Monkey and Banana Time Limit: 2000/1000 MS (Java ...

  4. HDU 1069 Monkey and Banana(动态规划)

    Monkey and Banana Problem Description A group of researchers are designing an experiment to test the ...

  5. HDU 1069 Monkey and Banana(二维偏序LIS的应用)

    ---恢复内容开始--- Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  6. HDU 1069 Monkey and Banana (DP)

    Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  7. HDU 1069—— Monkey and Banana——————【dp】

    Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. HDU 1069 Monkey and Banana 基础DP

    题目链接:Monkey and Banana 大意:给出n种箱子的长宽高.每种不限个数.可以堆叠.询问可以达到的最高高度是多少. 要求两个箱子堆叠的时候叠加的面.上面的面的两维长度都严格小于下面的. ...

  9. hdu 1069 Monkey and Banana

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. 自动化登录QQ脚本

    1.准备第三方包: py -3.6 -m pip install win32gui py -3.6 -m pip install Pywin32 py -3.6 -m pip install pyHo ...

  2. PHPmailer类的使用

    实现需要下载相关文件:在项目目录中运行 composer require phpmailer/phpmailer 还需要根据PHPinfo(); 确认是否开启了socket扩展和OpenSSL扩展 在 ...

  3. cgi 检索Cookie信息

    Cookie信息检索页非常简单,Cookie信息存储在CGI的环境变量HTTP_COOKIE中,存储格式如下: key1=value1;key2=value2;key3=value3.... 以下是一 ...

  4. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

  5. CSP2019-S2参赛总结 暨 近期学习反思

    前言 岁月不居,时节如流.眨眼间,2019的联赛就已经落下帷幕了,回忆这一年的学习,有许许多多的事情想写下来.趁联赛结果还未出来,赶紧写下这篇文章,以记录我这段时间的学习和生活. "你怎么又 ...

  6. 【UTR #3】量子破碎

    一道有趣的题. 看到按位的矩阵运算,如果对FWT比较熟悉的话,会比较容易地想到. 这种形式也就FWT等转移里面有吧--就算有其他的也难构造出来. 然而FWT的矩阵并不是酉矩阵(也就是满足 \(AA^T ...

  7. (Java多线程系列三)线程间通讯

    Java多线程间通讯 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 1.使用wait()和notify()方法在线程中通讯 需求:第一个线程写入(input)用户,另一个线程 ...

  8. 隐藏表单域、URL重写、cookie、session

    隐藏表单域: 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式:<input t ...

  9. java中的基本数据类型简谈

    在java里面有八大基本的数据类型,分别是 byte,short,char,int,long,float,double,boolean 然后需要说的就是几个特殊的基本数据类型的取值范围 先来说说byt ...

  10. Scala学习(四)——模式匹配与函数组合

    函数组合 让我们创建两个函数: def f(s: String) = "f(" + s + ")" def g(s: String) = "g(&qu ...