Hdu 1069 Monkey and Banana -- DP


/*
题意:给你n个箱子,有长宽高,箱子的个数不限,让你把它们摞起来以得到最高的高度。摞起来的规则是:上面箱子的长宽必须严格小于下面箱子的对应长宽。
	箱子可以翻转。
分析:按 立起来是长、宽、高将一个箱子看做是三个箱子。对长宽进行排序,再从最大的搜到最小的,每次更新得到的最大高度,即可得到结果。
	也可以用弗洛伊德求最长路的思想来做。
*/
#include<stdio.h>
#include<algorithm>
using namespace std;
struct  block{
	int x,y,z;
}a[100];
bool cmp(block a,block b)
{
	if(a.x=b.x)return a.y>b.y;
	return a.x>b.x;
}
int num;
void div(int x,int y ,int z)
{
	a[num].x = x>y?x:y;
	a[num].y = x+y-a[num].x;
	a[num].z = z;
	num++;
}
int main()
{
	int n;int x,y,z,ans,c;
	c = 0;
	while (scanf("%d",&n)!=EOF)
	{
		if(n==0)break;
		int h[105] = {0};
		num = 0;ans = 0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d %d %d",&x,&y,&z);
			div(x,y,z);
			div(x,z,y);
			div(y,z,x);
		}
		sort(a,a+num,cmp);
		for (int i = 0; i < num; i++)//h[i]表示以a[i].x,a[i].y为底所能得到的最大高度。
		{
			h[i] = 0;
			for (int j = i-1; j >= 0; j--)//每次都往前面去查。
			{
				if(a[i].x<a[j].x && a[i].y<a[j].y && h[j]>h[i])
					h[i] = h[j];
			}
			h[i] += a[i].z;
			if(h[i] > ans) ans = h[i];
		}
		printf("Case %d: maximum height = %d\n",++c,ans);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值