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. python图片识别

    python 图像处理模块1. 安装 pytesseract模块是会自动安装Pillow模块.pillow 为标准图像处理库 手册地址 http://pillow-cn.readthedocs.io/ ...

  2. lombok @Slf4j注解

    背景知道有这么个东西,是因为项目中用到了@Slf4j注解. lombok库提供了一些注解来简化java代码 官网:http://projectlombok.org/ 查看lombok所有api:htt ...

  3. WINDOWS 端口查看

    查看Windows下所有使用的端口 netstat -ano 查看Windows下某一个特定的端口 netstat -ano | find "8080"   查看windows下所 ...

  4. Linux command nmon

    Linux command nmon [Purpose]        Learning linux command nmon   [Eevironment]        Ubuntu 16.04 ...

  5. bzoj4310

    题解: 后缀数组求出本质不同的串 然后二分答案 贪心判断是否可行 代码: #include<bits/stdc++.h> ; using namespace std; typedef lo ...

  6. [POJ3378]Crazy Thairs

    Problem 给你一个数列,让你求由五个元素组成的顺序对的个数. Solution DP:用DP[i][j]表示把第j个作为五元组中第i个的方案数 则DP[i][j]=sum{DP[k][j-1]} ...

  7. day04 列表

    今天主要学习了 列表 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查 ...

  8. Windows下安装Tensorflow报错 “DLL load failed:找不到指定的模块"

    Windows下安装完tensorflow后,在cmd下运行python后import tensorflow出现如下错误: Traceback (most recent call last):  Fi ...

  9. 装饰器-wrapper

    我跟别人说我精通python,别人问我wrapper是啥,我说不知道,尼玛,原来wrapper就是装饰器,熟的不得了啊,英语真是我的克星啊. 闭包 closure 在认识装饰器之前先认识下闭包 闭包, ...

  10. 实力封装:Unity打包AssetBundle(一)

    说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...