HDU1069(Monkey and Banana)

描述:
多组输入n,接下来n行每行三个数,分别表示一个长方体的长宽高。每种长方体有无数个。
一个长方体可以搭在另一个长方体的前提条件是(可以是两个完全相同的长方体但是放的姿势不同)
该上面的长方体的长宽分别比下面那个长方体的长宽都短
要求堆的最高。

Ⅰ.简化题意和预处理

长方形每个面都可以作为底面,那我们把六种形态都存下来.

现在的问题就是,在这些长方体中,选出一些长方体来,有点背包的味道。

那我们先按照x,y大小排序,接下来就是类似最大上升子序列的做法了

枚举一个i,代表本次放第i个矩形在底部,然后在1~i-1中找更小的矩形转移即可。

#include <bits/stdc++.h>
using namespace std;
int n;
struct p{
	int x,y,z;
}d[609];int dp[609];
bool com(p a,p b){
	if(a.x!=b.x)	return a.x<b.x;
	return a.y<b.y;
}
int main()
{
	int k=1;
	while(cin>>n&&n)
	{
		int cnt=1;
		int q,w,e,ans=0;
		for(int i=1;i<=n;i++)
		{
			cin>>q>>w>>e;
			d[cnt].x=q,d[cnt].y=w,d[cnt++].z=e;
			d[cnt].x=w,d[cnt].y=q,d[cnt++].z=e;
			d[cnt].x=q,d[cnt].y=e,d[cnt++].z=w;
			d[cnt].x=e,d[cnt].y=q,d[cnt++].z=w;
			d[cnt].x=w,d[cnt].y=e,d[cnt++].z=q;
			d[cnt].x=e,d[cnt].y=w,d[cnt++].z=q;
			ans=max(ans,max(q,max(e,w))); 
		}
		sort(d+1,d+cnt,com);
		memset(dp,0,sizeof(dp));
		for(int i=1;i<cnt;i++)
		{
			dp[i]=d[i].z;
			for(int j=1;j<i;j++)
			{
				if(d[i].x>d[j].x&&d[i].y>d[j].y)
					dp[i]=max(dp[i],dp[j]+d[i].z);
				ans=max(ans,dp[i]);
			}
		}
		cout<<"Case "<<k++<<": maximum height = "<<ans<<endl;
	}
}
原文地址:https://www.cnblogs.com/iss-ue/p/12587378.html