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. office install problems

    regedit 0000 "00005"或"00002"开头的项 remove all regedit options

  2. 未能加载文件或程序集“Oracle.DataAccess”或它的某一个 依赖项。如何解决?

    之前项目做大数据批量添加使用了OracleBulkCopy,这个是引用Oracle.DataAccess.Client的命名空间,所以项目要引用一个Oracle.DataAccess.dll, 但是运 ...

  3. Ubuntu16.10下使用VSCode开发.netcore

    按照通常的套路,首先创建一个空白的解决方案,需要用到.netcore sdk命令: dotnet new sln -o dotnetcore_tutrorial 这个时候可以看到在目标目录下生成了一个 ...

  4. 解决了好几个软件的构建问题,在解决部署问题,bluemix部署

    https://www.puteulanus.com/archives/838#comment-961新版 Bluemix 一键搭建 SS 脚本 https://blog.feixueacg.com/ ...

  5. dede织梦调取一二三级栏目名及栏目下的内容列表的方法

    网站根据需要,把地区划成省-市-文章的层级结构,栏目首页需要显示的是 复制代码代码如下: {dede:channelarclist} <!--省显示--> <a href=" ...

  6. Linux文件管理常用命令用法总结

    1.touch change file timestamps. 命令用于修改文件或者目录的时间属性,包括存取时间和更改时间.若文件不存在,系统会建立一个新的文件.stat,ls -l 可以显示档案的时 ...

  7. SQL-15 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列

    题目描述 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列CREATE TABLE `employees` (`emp_no ...

  8. DevExpress WPF v18.2新版亮点(一)

    买 DevExpress Universal Subscription  免费赠 万元汉化资源包1套! 限量15套!先到先得,送完即止!立即抢购>> 行业领先的.NET界面控件2018年第 ...

  9. java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.test.Test

    由于我在第二个Activity中指定了进程名字,但是服务却没有指定进程名(默认跟主入口一个进程)所以报错. 网上找到的是 服务 和绑定服务的客户端必须在同一个application或者进程中,所以Ma ...

  10. SharePoint REST API - 基本操作(二)

    博客地址:http://blog.csdn.net/FoxDave 上一节讲了SharePoint REST API的一些基本操作,本节将继续介绍一些关于SharePoint REST API的内容. ...