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. 【Query】使用java对mysql数据库进行查询操作

    操作步骤: 1.加载数据库驱动(先在工程里加载数据库对应的驱动包) 2.获取连接 3.根据连接建立一个可执行sql的对象 4.执行sql语句 5.关闭连接 代码: package database; ...

  2. win10打文件预览功能

  3. day14-python异常处理

    1.     异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Pyt ...

  4. awk计算最大值,最小值,平均值的脚本

    传入至少三个数字参数到脚本awk_file,并计算出最大,最小,平均值.需要判断传入的数字是否足够,否则输出警告信息.平均值保留两位小数. 如执行bash awk_file 3 4 6 5,脚本输出结 ...

  5. flask项目结构(一)mariadb

    简介: 本文主要是根据自己所学,创建一个flask项目,使用sqlalchemy,alembic,mariadb,bootstrap,APScheduler,selenium,request…………技 ...

  6. 二:通过VirtualBox+Vagrant创建一个centos的虚拟机:

    官网安装VirtualBox及Vagrant. 下载centos7,添加到vagrant中. http://e-proxy.yfb.sunline.cn/download/vagrant/centos ...

  7. Linux系统命令行中vim编辑器取消高亮显示

    由于在使用vim编辑代码的时候不小心忘记首先输入i(insert)模式,导致写的代码出现了棕黄色的阴影显示 摸索了很久终于找到了解决方法: 1.退出vim编译器 2.在在命令行下输入:nohl,回车 ...

  8. 7.4 C++标准模板库(STL)的概念

    参考:http://www.weixueyuan.net/view/6401.html 总结:  标准模板库为C++提供了完善的数据结构及算法. 标准模板库包括三部分:容器.算法和迭代器. 容器是对象 ...

  9. Codeforces Round #212 (Div. 2) C. Insertion Sort

    C. Insertion Sort Petya is a beginner programmer. He has already mastered the basics of the C++ lang ...

  10. 预期结果 参数化parametrize

    1.pytest.mark.parametrize装饰器可以实现测试用例参数化. 2.实例: import pytest @pytest.mark.parametrize("req,expe ...