hdu1069

题目描述:一组研究人员正在设计一项实验,以测试猴子的智商。他们将以平均时间挂香蕉在建筑物的屋顶,提供给一些块猴子。如果猴子足够聪明,它应当能够通过叠加长方体,并爬上去拿到香蕉。

研究人员有n个类型的块,每种类型的块无限供应。每种类型i的块为长方体与线性尺寸(xi,yi,zi)。 每个长方体可以按任意形状放置。

他们希望确保最高的塔可以通过堆叠模块可以达到屋顶。问题在于,在构建塔,一个块只能只要放置在另一个块的顶部的两个基上块的尺寸是比下层块的相应的基本尺寸都严格小,因为必须有对于猴子的一些空间来踩。这意味着,例如,定向为具有相等大小的碱基块不能被堆叠。

你的任务是编写一个程序,确定可以用一组给定块的建设的塔的高度。

输入:输入文件包含多个测试用例。每个测试用例的第一行是一个整数n,代表接下来的数据集中的不同的块的数目,n最大是30.接下来的n行中,每行包含三个数字,分别代表xi,yi,zi.输入的n是0的时候结束。

输出:对于每一种情形,输出这样的形式:"Case case: maximum height = height".

思路分析:这道题目,实际就是求单调递增的子序列的最大和。注意的是一个长方体按照不同的摆放方式会形成6中情况。

代码如下:

# include 
# include 
using namespace std;

struct Node
{
	int l,w,h;
}cb[180];

int dp[180];

int cmp(Node a,Node b)    
{    
    if(a.l!=b.l)    
        return a.l>b.l?1:0;    
    else    
        return a.w>b.w?1:0;    
}   

int main()
{
	//freopen("input.txt","r",stdin);
	int n,i,j,height,total;
	total=0;
	int a,b,c;
	while( scanf("%d",&n)!=EOF && n)
	{
		total++;
		int len=0;
		for(i=0;icb[i].l && cb[j].w>cb[i].w)
				{
					if(dp[j]>max)
						max=dp[j];
				}
			}
			dp[i]=max+cb[i].h;
			if(height


你可能感兴趣的:(acm)