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;
}

最新文章

  1. Hive_配置远程Metastore
  2. 浅谈php设计模式(1)---工厂模式
  3. MyISAM 调度(优先级)的一些优化【转】
  4. Leetcode: Minimum Genetic Mutation
  5. ✡ leetcode 159. Longest Substring with At Most Two Distinct Characters 求两个字母组成的最大子串长度 --------- java
  6. 网页制作技巧:iframe自适应高度
  7. HTML&lt;marquee&gt;标签
  8. Introduction to Project Management(I)
  9. struts2校验の实现
  10. 【POJ】【1067】取石子游戏
  11. Android之 环境搭建
  12. C# Winform应用程序占用内存较大解决方法整理
  13. 12天学好C语言——记录我的C语言学习之路(Day 5)
  14. ListView复用和优化详解
  15. android软键盘的管理和属性的设置
  16. 以下内容对于灵活修改textField中文本以及占位文本属性进行了完整的封装,加入项目中可以节约开发时间。
  17. Stanford Word Segmenter使用
  18. LeetCode算法题-Find Smallest Letter Greater Than Target(Java实现)
  19. 全基因组关联分析(GWAS)扫不出信号怎么办(文献解读)
  20. 巧用Win+R

热门文章

  1. Android studio 一个项目引入另一个项目作为Libary
  2. 五笔xu
  3. C/C++ 全局变量的访问
  4. C++11 并发之std::thread std::mutex
  5. ubuntu16.10安装搜狗输入法
  6. react router @4 和 vue路由 详解(五)react怎么通过路由传参
  7. TNS
  8. UVA 11464 - Even Parity 状态压缩,分析 难度: 2
  9. [Leetcode 392]判断子序列 Is Subsequence
  10. 深入理解java虚拟机---lanmbda表达式简介(三)