Monkey and Banana

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 19928    Accepted Submission(s): 10609

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种砖块,每种砖块的长宽高已知,每种砖块个数无限,选出一些砖块建塔,要求在下面砖块的长和宽大于上面砖块的长宽,在满足这个要求的情况下,塔的最大高度

思路

每次输入一种砖块的长宽高,把这种砖的摆放情况情况枚举出来,存到结构体中,然后dp就行了

AC代码

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <limits.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <string>
#define ll long long
#define ms(a) memset(a,0,sizeof(a))
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
const double E=exp(1);
const int maxn=1e3+10;
using namespace std;
struct wzy
{
int a,b,c;//长宽高
int dp;
}p[maxn];
bool cmp(wzy u,wzy v)
{
if(u.a==v.a)
return u.b<v.b;
return u.a<v.a;
}
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
int n;
int t=0;
int x,y,z;
while(cin>>n&&n)
{
ms(p);
int k=0;
for(int i=0;i<n;i++)
{
cin>>x>>y>>z;
if(x==y)
{
if(x==z)
{
p[k].a=x;p[k].b=y;p[k].c=z;p[k].dp=p[k].c;k++;
}
else
{
p[k].a=x;p[k].b=y;p[k].c=z;p[k].dp=p[k].c;k++;
p[k].a=x;p[k].b=z;p[k].c=y;p[k].dp=p[k].c;k++;
p[k].a=z;p[k].b=x;p[k].c=y;p[k].dp=p[k].c;k++;
}
}
else
{
if(y==z)
{
p[k].a=x;p[k].b=y;p[k].c=z;p[k].dp=p[k].c;k++;
p[k].a=y;p[k].b=z;p[k].c=x;p[k].dp=p[k].c;k++;
p[k].a=z;p[k].b=x;p[k].c=y;p[k].dp=p[k].c;k++;
}
else if(x==z)
{
p[k].a=x;p[k].b=y;p[k].c=z;p[k].dp=p[k].c;k++;
p[k].a=x;p[k].b=z;p[k].c=y;p[k].dp=p[k].c;k++;
p[k].a=y;p[k].b=x;p[k].c=z;p[k].dp=p[k].c;k++;
}
else
{
p[k].a=x;p[k].b=y;p[k].c=z;p[k].dp=p[k].c;k++;
p[k].a=x;p[k].b=z;p[k].c=y;p[k].dp=p[k].c;k++;
p[k].a=y;p[k].b=x;p[k].c=z;p[k].dp=p[k].c;k++;
p[k].a=y;p[k].b=z;p[k].c=x;p[k].dp=p[k].c;k++;
p[k].a=z;p[k].b=y;p[k].c=x;p[k].dp=p[k].c;k++;
p[k].a=z;p[k].b=x;p[k].c=y;p[k].dp=p[k].c;k++;
}
}
}
sort(p,p+k,cmp);
int ans=0;
for(int i=1;i<k;i++)
{
for(int j=0;j<i;j++)
{
if(p[i].a>p[j].a&&p[i].b>p[j].b)
p[i].dp=max(p[i].dp,p[j].dp+p[i].c);
}
ans=max(ans,p[i].dp);
}
cout<<"Case "<<++t<<": maximum height = ";
cout<<ans<<endl;
}
return 0;
}

HDU 1069:Monkey and Banana(DP)的更多相关文章

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

    Monkey and Banana 直接写中文了 Problem Statement 一组研究人员正在设计一项实验,以测试猴子的智商.他们将挂香蕉在建筑物的屋顶,同时,提供一些砖块给这些猴子.如果猴子 ...

  2. HDU 1069 Monkey and Banana (dp)

    题目链接 Problem Description A group of researchers are designing an experiment to test the IQ of a monk ...

  3. HDU 1069 Monkey and Banana ——(DP)

    简单DP. 题意:给出若干种长方体,如果摆放时一个长方体的长和宽小于另一个的长宽,那么它可以放在另一个的上面,问最高能放多少高度.每种长方体的个数都是无限的. 做法:因为每种个数都是无限,那么每种按照 ...

  4. HDU1069 Monkey and Banana(dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题意:给定n种类型的长方体,每个类型长方体无数个,要求长方体叠放在一起,且上面的长方体接触面积要小于 ...

  5. HDU 1231:最大连续子序列(DP)

    pid=1231">最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  6. ZOJ 1093 Monkey and Banana (LIS)解题报告

    ZOJ  1093   Monkey and Banana  (LIS)解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

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

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

  8. HDU 1024 Max Sum Plus Plus(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题目大意:有多组输入,每组一行整数,开头两个数字m,n,接着有n个数字.要求在这n个数字上,m块 ...

  9. HDU 2830:Matrix Swapping II(思维)

    http://acm.hdu.edu.cn/showproblem.php?pid=2830 题意:-- 思路:对于每一列,它是固定的,用dp[][]处理出连续的长度.例如: 假设我们扫第四列的时候, ...

随机推荐

  1. vue 小知识

    图片: 1.img 的路径 <img :src="item.src"/> 2.背景图片的路径 v-bind:style="{backgroundImage: ...

  2. JAVA的SPI简单应用

    最近在研究dubbo时,发现了JAVA的SPI特性.SPI的全名为Service Provider Interface,是JDK内置的一种服务发现机制. 具体实现: 1.定义一个接口 public i ...

  3. CAS5.3-搭建https服务器

    在上一篇文章中https://www.cnblogs.com/zhi-leaf/p/10417627.html.我们使用http://127.0.0.1:8080/cas/登录发现页面显示如下警告.该 ...

  4. Mac下安装和配置Maven

    1.下载Maven 官网:http://maven.apache.org/download.cgi 下载版本:apache-maven-3.5.3-bin.tar.gz 2.配置环境变量 打开term ...

  5. 回声UDP服务器端/客户端

    UDP是具有数据边界的协议,传输中调用I/O函数的次数非常重要.输入函数的调用次数要和输出函数的调用次数完全一致,这样才能保证接受全部已发送的数据. TCP套接字中需注册待传输数据的目标IP和端口,而 ...

  6. window有哪写事件?

    onload:加载事件网页加载完毕后执行. onscroll:滚动事件. onresize:窗口缩放事件.

  7. 【资料收集】Converting Between cv::Mat and QImage or QPixmap

    参考: 方法一 Convert between cv::Mat and QImage 两种图片类转换 - Grandyang - 博客园 http://www.cnblogs.com/grandyan ...

  8. gulp安装和使用

    1.全局安装gulp:sudo npm install -g gulp 2.代码根目录:npm install 3.gulp 开始编译(在项目根目录下创建一个名为 gulpfile.js 的文件) 注 ...

  9. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  10. Cracking The Coding Interview 5.7

    //An array A[1-n] contains all the integers from 0 to n except for one number which is missing. In t ...