程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU1069(最長單調遞減數列)

HDU1069(最長單調遞減數列)

編輯:C++入門知識

告訴你n種規模的長方體的長,寬,高,每種規模的長方體個數不限,問你最多能搭多高的塔,塔是由這些長方體搭的,自上而下,每一塊長方體都要比在它下面的長方體的規模小,即長和寬都比下面的長方體要小。注意長方體是可以調整的。

就是按照長和寬來排序,找最長的單調遞減的數列。我們用dp[i]來表示搭建到第i塊長方體的時候塔的最高高度,那麼狀態轉移方程就是dp[i]=max(dp[i],dp[j]+s[i].h);

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#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=0;i--)
		{
			for(int j=i+1;js[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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved