uva437 poj2241 The Tower of Babylon dp

// 这题开始在算法竞赛入门经典的书上状态表示
// dp[i][j]表示前i个方块以第j条边为高所能得到的最大高度值
// dp[i][j] = max(dp[0...i-1][0,1,2]+block[i][j]);
// 就是一个DAG模型
// 这样记忆化搜索就行啦,还是有些技巧的
//
// 第二种做法就是递推
// 首先把一个方块变为6个,即表示长,宽,高
// 当然,首先得要把底面积从大到小排序
// dp[i]表示前i种方块所能达到的最大高度
// dp[i] = max(dp[0...i-1])+block[i].hi;
//
//
//好吧,继续练吧。。。

#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfloat>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#define ceil(a,b) (((a)+(b)-1)/(b))
#define endl '\n'
#define gcd __gcd
#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
#define popCount __builtin_popcountll
typedef long long ll;
using namespace std;
const int MOD = 1000000007;
const long double PI = acos(-1.L);

template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }
template<class T> inline T lowBit(const T& x) { return x&-x; }
template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }
template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }

const int maxn = 200;
int dp[maxn];
struct node {
	int lg;
	int wi;
	int hi;
}b[maxn];
int n;
int num;

bool cmp(node a,node b){
	if (a.lg*a.wi>b.lg*b.wi)
		return true;
	return false;
}

void init(){
	memset(b,0,sizeof(b));
	int x,y,z;
	num=0;
	for (int i=0;i<n;i++){
		scanf("%d%d%d",&x,&y,&z);
		b[num++]=(node){x,y,z};
		b[num++]=(node){x,z,y};
		b[num++]=(node){y,x,z};
		b[num++]=(node){y,z,x};
		b[num++]=(node){z,x,y};
		b[num++]=(node){z,y,x};
	}
	sort(b,b+num,cmp);
	memset(dp,0,sizeof(dp));
}

void print(){
	for (int i=0;i<num;i++)
		printf("%d ",dp[i]);
	puts("");
}

void solve(int kase){
	for (int i=0;i<num;i++){
		int mx = 0;
		for (int j=0;j<i;j++){
			if (b[i].lg<b[j].lg&&b[i].wi<b[j].wi)
				mx = max(mx,dp[j]);
		}
		dp[i] = mx+b[i].hi;
	}
	//print();
	int hx = 0;
	for (int i=0;i<num;i++)
		hx = max(hx,dp[i]);
	printf("Case %d: maximum height = %d\n",kase,hx);
}

int main() {
	//freopen("G:\\Code\\1.txt","r",stdin);
	int kase=0;
	while(scanf("%d",&n)!=EOF){
		if (!n)
			break;
		init();
		solve(++kase);
	}
	return 0;
}

//#include <algorithm>
//#include <bitset>
//#include <cassert>
//#include <cctype>
//#include <cfloat>
//#include <climits>
//#include <cmath>
//#include <complex>
//#include <cstdio>
//#include <cstdlib>
//#include <cstring>
//#include <ctime>
//#include <deque>
//#include <functional>
//#include <iostream>
//#include <list>
//#include <map>
//#include <numeric>
//#include <queue>
//#include <set>
//#include <stack>
//#include <vector>
//#define ceil(a,b) (((a)+(b)-1)/(b))
//#define endl '\n'
//#define gcd __gcd
//#define highBit(x) (1ULL<<(63-__builtin_clzll(x)))
//#define popCount __builtin_popcountll
//typedef long long ll;
//using namespace std;
//const int MOD = 1000000007;
//const long double PI = acos(-1.L);
//
//template<class T> inline T lcm(const T& a, const T& b) { return a/gcd(a, b)*b; }
//template<class T> inline T lowBit(const T& x) { return x&-x; }
//template<class T> inline T maximize(T& a, const T& b) { return a=a<b?b:a; }
//template<class T> inline T minimize(T& a, const T& b) { return a=a<b?a:b; }
//
//const int maxn = 50;
//int a[maxn][3];
//int	d[maxn][3];
//int n;
//
//void init(){
//	for (int i=0;i<n;i++){
//		scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
//		sort(a[i],a[i]+3);
//	}
//	memset(d,0,sizeof(d));
//}
//
//void get(int v[],int x,int id){
//	int index=0;
//	for (int i=0;i<3;i++)
//		if (i!=id)
//			v[index++]=a[x][i];
//}
//
//int dp(int i,int j){
//	int& ans = d[i][j];
//	if (ans>0)	return ans;
//	ans = 0;
//	int v1[2],v2[2];
//	get(v1,i,j);
//	for (int x=0;x<n;x++){
//		for (int y=0;y<3;y++){
//			get(v2,x,y);
//			if (v2[0]<v1[0]&&v2[1]<v1[1])
//				ans = max(ans,dp(x,y));
//		}
//	}
//	ans +=a[i][j];
//	return ans;
//}
//
//
//void solve(int& ans){
//	for (int i=0;i<n;i++)
//		for (int j=0;j<3;j++)
//			ans = max(ans,dp(i,j));
//}
//
//int main() {
//	freopen("G:\\Code\\1.txt","r",stdin);
//	int cnt=0;
//	while(scanf("%d",&n)!=EOF){
//		if (!n)
//			break;
//		init();
//		int ans = 0;
//		solve(ans);
//		printf("Case %d: maximum height = %d\n",++cnt,ans);
//	}
//	return 0;
//}

时间: 2024-10-23 01:47:06

uva437 poj2241 The Tower of Babylon dp的相关文章

UVA 437 The Tower of Babylon DP

有向图DAG The Tower of Babylon Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So n

POJ2241——The Tower of Babylon

The Tower of Babylon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2207   Accepted: 1244 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line

UVa 437 The Tower of Babylon(DP 最长条件子序列)

 题意  给你n种长方体  每种都有无穷个  当一个长方体的长和宽都小于另一个时  这个长方体可以放在另一个上面  要求输出这样累积起来的最大高度 因为每个长方体都有3种放法  比较不好控制   可以把一个长宽高分成三个长方体  高度是固定的  这样就比较好控制了 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 105 int x[max

poj2241 The Tower of Babylon

The Tower of Babylon 题意:给你n种石头,长x,宽y,高z,每种石头数目无限,一块石头能放到另一块上的条件是:长和宽严格小于下面的石头.问叠起来的最大高度. /* 有些类似“叠箱子”问题,看起来一种砖有无限多个,其实最多只能用到两次. 说下我的思路吧,一块砖有3个数据,虽然3!=6,但本质上还是只有3种,把这三种都表示出来,使x<=y:这样就有了3n组数据.因为我不会建图,就把这3n组数据再排列一下,使一块砖只能放到它后面的砖之上,而绝不能放到之前的砖上,即按x为一级y为二级

UVa437,The Tower of Babylon

转:http://blog.csdn.net/wangtaoking1/article/details/7308275 题意为输入若干种立方体(每种若干个),然后将立方体堆成一个塔,要求接触的两个面下底面的长宽分别严格大于上底面,求塔的最大高度. 将每种立方体的各种摆放形式均视为不同的立方体,并存起来.再将所有立方体按照下底面的面积从小到大排序(因为在塔上面的立方体的底面积一定比下面的小),然后只需求该序列的最大上升子序列的长度即可. #include <iostream> #include

uva--437The Tower of Babylon+dp

题意: 给定一些立方体,对于两个立方体,只有其中一个底面两个边都严格小于另一个才可以放在其上面.求可以得到的最大高度. 思路: 一个立方体可以转成6个底面不同的具有不同权值(高度)的矩形,然后就是这些矩形的嵌套问题了.以前是将这个问题转成了DAG图上的最长路做的:这一次直接将这些矩形按照底面积由小到大的排序,然后问题就变成求最长上升子序列了. 代码如下: #include<iostream> #include<cstring> #include<cstdio> #inc

uva437 - The Tower of Babylon(DAG上的DP)

题目:uva437 - The Tower of Babylon(DAG上的DP) 题目大意:给你一些立方体,给出长宽高XYZ.现在希望你将这些立方题叠起来,使得最后的高度最大,并且这些立方体是可以无限次使用的,但是一个立方体要在另一个立方体的上面的话是需要满足这个立方体的底面是可以完全包含在下面的那个立方体的底面. 解题思路:其实这里的无限次使用没有什么用,因为一个立方体最多使用三次就不可能是再用.输入的一个立方体其实可以变成三个确定长宽高的立体.然后将这些立方体先做预处理,如果立方体j能够放

UVa 437 The Tower of Babylon(动态规划)

传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you the whole story: The babylonians had n

POJ 2241 The Tower of Babylon

The Tower of Babylon Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID: 224164-bit integer IO format: %lld      Java class name: Main Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many d