首页 > 代码库 > HDU1069(最长单调递减数列)

HDU1069(最长单调递减数列)

告诉你n种规模的长方体的长,宽,高,每种规模的长方体个数不限,问你最多能搭多高的塔,塔是由这些长方体搭的,自上而下,每一块长方体都要比在它下面的长方体的规模小,即长和宽都比下面的长方体要小。注意长方体是可以调整的。

就是按照长和宽来排序,找最长的单调递减的数列。我们用dp[i]来表示搭建到第i块长方体的时候塔的最高高度,那么状态转移方程就是dp[i]=max(dp[i],dp[j]+s[i].h);

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <stack>
#include <set>
#define M 100000+5
#define LL long long
#define Ld __int64
#define eps 0.00001
#define INF 999999999
#define MOD 112233
#define MAX 26
#define PI acos(-1.0)
using namespace std;

struct solid
{
	int l,w,h;
}s[155];

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

int main()
{
	int n,cont=1;
	int d[3];
	int dp[155];
	while(~scanf("%d",&n),n)
	{
		int k=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d",&d[0],&d[1],&d[2]);
			sort(d,d+3);
			s[k].l=d[2],s[k].w=d[1],s[k++].h=d[0];		//各种长方体
			s[k].l=d[2],s[k].w=d[0],s[k++].h=d[1];
			s[k].l=d[1],s[k].w=d[0],s[k++].h=d[2];
		}
		sort(s,s+k,cmp);
		for(int i=0;i<k;i++)			//初始化为各自的高度
			dp[i]=s[i].h;
		for(int i=k-2;i>=0;i--)
		{
			for(int j=i+1;j<k;j++)
			{
				if(s[i].l>s[j].l && s[i].w>s[j].w)
				{
					dp[i]=max(dp[i],dp[j]+s[i].h);
				}
			}
		}
		int ans=-1;
		for(int i=0;i<k;i++)		//找最大高度
			ans=max(ans,dp[i]);
		printf("Case %d: ",cont++);
		printf("maximum height = %d\n",ans);
	}
	return 0;
}