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
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
该题摆木块有三种方式,故对每一组数据,能产生三个数据;
同时限定其l<=w,否则会出错;
接着对处理得到的3*T个数据进行排序,先按l排,再按w排,我是从小到大排;
在用dp[i]表示取第i块作为底所能够达到的最高高度,那么dp[i]=max(dp[j])+a[i].h, 其中:j<i&&a[j].l<a[i].l&&a[j].w<a[i].w;
答案即为dp[i]中的最大值。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
#define LL long long
using namespace std;
struct zhuan{
int h;
int l;
int w;
}a[95];
bool cmp(zhuan a,zhuan b)
{
return a.l==b.l? a.w<b.w:a.l<b.l;
}
int main()
{
int t,i,j,ca=1,maxn,ans;
int dp[95],x[3];
while(~scanf("%d",&t),t){
for(i=0;i<t;++i){
scanf("%d%d%d",&x[0],&x[1],&x[2]);
sort(x,x+3);
a[3*i].l=a[3*i+1].h=a[3*i+2].l=x[0];
a[3*i+1].l=a[3*i+2].h=a[3*i].w=x[1];
a[3*i+2].w=a[3*i].h=a[3*i+1].w=x[2];
}
sort(a,a+3*t,cmp);
memset(dp,0,sizeof(dp));
ans=dp[0]=a[0].h;
for(i=1;i<3*t;++i){
for(j=0;j<i;j++){
if(a[j].l<a[i].l&&a[j].w<a[i].w){
dp[i]=dp[i]<dp[j]? dp[j]:dp[i];
}
}
dp[i]+=a[i].h;
ans=ans<dp[i]? dp[i]:ans;
}
printf("Case %d: maximum height = %d\n",ca++,ans);
}
return 0;
}
本文介绍了一个经典的编程问题——猴子搭塔。通过给定不同尺寸的积木,算法需找出能够搭建的最高塔的高度。文章提供了详细的解决方案,包括数据处理、排序及动态规划等步骤。
7222

被折叠的 条评论
为什么被折叠?



