C - Monkey and Banana (HDU - 1069) (dp)(最长上升子序列+枚举)

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种箱子随便取,给出长宽高,问最高能垒多少(上面的箱子长和宽必须小于下面箱子)
数据范围比较小,n<=30。而一个箱子放置的方法有六种,我们可以把这六种方法全部枚举出来。
从下向上叠箱子,肯定从大的开始。我们给箱子按长度排个序。
这样就能保证上面的箱子比下面的箱子长。
然后,不就是宽度的最长上升子序列了吗!

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

struct node{
	int l,w,h;
}a[400];

int dp[400];

bool cmp(node a,node b){
	if(a.l==b.l) return a.w>=b.w;
	else return a.l>=b.l;
}

int main(){
	int n;
	int cnt=1;
	while(~scanf("%d",&n)){
		if(n==0) break;
		memset(dp,0,sizeof(dp));
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++){
			scanf("%d%d%d",&a[i].l,&a[i].w,&a[i].h);
			a[n+i].l=a[i].w,a[n+i].w=a[i].h,a[n+i].h=a[i].l;
			a[2*n+i].l=a[i].l,a[2*n+i].w=a[i].h,a[2*n+i].h=a[i].w;
			a[3*n+i].l=a[i].w,a[3*n+i].w=a[i].l,a[3*n+i].h=a[i].h;
			a[4*n+i].l=a[i].h,a[4*n+i].w=a[i].l,a[4*n+i].h=a[i].w;
			a[5*n+i].l=a[i].h,a[5*n+i].w=a[i].w,a[5*n+i].h=a[i].l;									
		}
		sort(a+1,a+6*n+1,cmp);
// for(int i=1;i<=6*n;i++) printf("l:%d w:%d h:%d\n",a[i].l,a[i].w,a[i].h);
		int maxn=0;
		a[0].l=0x3f3f3f;
		a[0].w=0x3f3f3f;
		for(int i=1;i<=6*n;i++){
			for(int j=0;j<i;j++){
				if((a[j].l!=a[i].l&&a[j].w!=a[i].w)&&a[i].w<=a[j].w){
					if(a[i].h+dp[j]>dp[i]){
					dp[i]=dp[j]+a[i].h;
// printf("i:%d j:%d dp[i]:%d \n",i,j,dp[i]); 
					}
				}
			}
			maxn=max(dp[i],maxn);
		}
		printf("Case %d: maximum height = %d\n",cnt++,maxn);
	}
} 
全部评论

相关推荐

老树开花:可以开始投了,不用等到觉得完全准备好。一边投一边根据面试反馈改简历是最高效的方式。简历上项目描述建议突出你解决的具体问题,比如编辑器的性能优化、大文档渲染怎么处理的,而不只是列技术栈。中厂前端实习现在竞争确实激烈,建议同时关注一些有AI业务的团队,前端加AI应用是很有差异化的组合。Vue全家桶基础扎实的话可以往SSR或者跨端方向延伸,这些是面试加分项。加油,时间还来得及。
点赞 评论 收藏
分享
04-15 13:42
四川大学 Java
蹲蹲offerrr:快投吧,有点晚现在
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务