Monkey and Banana
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种类型的区块,每种类型的区块都有无限的供应。每一个I型块是一个具有线性尺寸的矩形实体(Xi,Yi,Zi)。一个块可以重新定位,使其三维中的任何两个确定了基础的尺寸,而另一个尺寸是高度。
他们想通过堆积木来确保最高的塔能到达屋顶。问题是,在建造一座塔楼时,只要上一座塔楼的两个底座尺寸都严格小于下一座塔楼的相应底座尺寸,一座塔楼就只能放在另一座塔楼的顶部,因为猴子必须有一定的空间才能踩上去。这意味着,例如,面向具有相同大小基的块不能堆叠。
你的工作是编写一个程序来确定猴子用一组给定的积木可以建造的最高的塔的高度。
输入
输入文件将包含一个或多个测试用例。每个测试用例的第一行包含一个整数n, 表示以下数据集中不同块的数目。n的最大值为30。每一个N行包含三个表示值Xi、Yi和Zi的整数。输入以n的0结束。
输出
对于每一个测试用例,打印一个包含案例号的行(它们是从1开始顺序编号)和最高的可能塔的高度,格式为“案例:最大高度=高度”。
题意: 题目说研究人员可以为猴子提供没有数量限制的一定长宽高的长方体积木块,让猴子自己来搭一个塔,但是要严格按照下面长方体的长和宽都>上方的长方体的长和宽,求猴子可以搭出塔的最大高度.
思路: 虽然说是可以无限取积木块,但是经过由题目要求的下面长方体的长和宽都严格大于上方的长方体的长和宽,可以得知每种样式得长方体块最多只能选三个,知道这条信息之后,我们就可以简化该问题,首先我们可以用结构体把每种样式的三种类型存入,接着在用sort排序将长或宽进行排序,最后用求最大递增子序列的思维求最大高度即可.
由我的思路所写出的AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct lport
{
int lon,wei,h;
}vis[10005];
bool cmp(lport a,lport b)
{
return a.lon<b.lon;
}
int main()
{
int n,t=1;
while(~scanf("%d",&n))
{
if(n==0)
return 0;
int k=1,dp[10005];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
vis[k].lon=max(x,y);
vis[k].wei=min(x,y);
vis[k].h=z;k++;
vis[k].lon=max(x,z);
vis[k].wei=min(x,z);
vis[k].h=y;k++;
vis[k].lon=max(z,y);
vis[k].wei=min(z,y);
vis[k].h=x;k++;
}sort(vis+1,vis+k,cmp);k--;
for(int i=1;i<=k;i++)
{dp[i]=vis[i].h;
for(int j=1;j<=i;j++)
{
if(vis[i].lon!=vis[j].lon&&vis[i].wei>vis[j].wei)
dp[i]=max(dp[i],dp[j]+vis[i].h);
}
}sort(dp+1,dp+k+1);
printf("Case %d: maximum height = %d\n",t,dp[k]);
t++;
}
}