例题9-2 UVA - 437 The Tower of Babylon 巴比伦塔(DGA-DP)

大体题意:

给你n种立方体,每种都无限个,要求选择一些立方体使得高度最大,并且满足越靠上的立方体长宽严格小于下面的!每个立方体可以旋转!

输出最大高度!

思路:

可以把立方体的属性存到Node结构体里,因为一个立方体就可以有6种状态,很少,可以手写进Node里。

然后按照面积排序!

最后按照DGA形式 求最长长度!

if (nod[j].x < nod[i].x && nod[j].y < nod[i].y)
dp[i] = max(dp[i],dp[j]+nod[i].z);

意为j 的序列长度 加上i 即可!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 500 + 10;
struct Node{
	int x,y,z;
	Node ():x(0),y(0),z(0){}
	Node (int x,int y,int z):x(x),y(y),z(z){}
	bool operator < (const Node & rhs) const {
		return x*y < rhs.x*rhs.y;
	}
}nod[maxn];
int dp[maxn];
int main(){
	int n,kase=0;
	while(scanf("%d",&n) == 1 && n){
		memset(dp,0,sizeof dp);
		int cnt = 0;
		for (int i = 0; i < n; ++i){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			nod[cnt++] = Node(x,y,z);
			nod[cnt++] = Node(x,z,y);
			nod[cnt++] = Node(y,x,z);
			nod[cnt++] = Node(y,z,x);
			nod[cnt++] = Node(z,x,y);
			nod[cnt++] = Node(z,y,x);
		}
		sort(nod,nod+cnt);
		int temp = 0;
		for (int i = 0; i < cnt; ++i){
			dp[i] = nod[i].z;
			for (int j = 0; j < i; ++j){
				if (nod[j].x < nod[i].x && nod[j].y < nod[i].y)
					dp[i] = max(dp[i],dp[j]+nod[i].z);
			}
			temp = max(temp,dp[i]);
		}
		printf("Case %d: maximum height = %d\n",++kase,temp);
	}
	return 0;
}


你可能感兴趣的:(dp,C语言,uva)