传送门

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 types of blocks, and an unlimited supply of blocks of each type. Each type-i block was a rectangular solid with linear dimensions (xi , yi , zi). A block could be reoriented so that any two of its three dimensions determined the dimensions of the base and the other dimension was the height. They wanted to construct the tallest tower possible by stacking blocks. The problem was that, in building a tower, one block could only be placed on top of another block as long as the two base dimensions of the upper block were both strictly smaller than the corresponding base dimensions of the lower block. This meant, for example, that blocks oriented to have equal-sized bases couldn’t be stacked. Your job is to write a program that determines the height of the tallest tower the babylonians can build with a given set of blocks.

Input

The input file will contain one or more test cases. The first line of each test case contains an integer n, representing the number of different blocks in the following data set. The maximum value for n is 30. Each of the next n lines contains three integers representing the values xi , yi and zi . Input is terminated by a value of zero (0) for n.

Output

For each test case, print one line containing the case number (they are numbered sequentially starting from 1) and the height of the tallest possible tower in the format ‘Case case: maximum height = height’

Sample Input

1
10 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0

Sample Output

Case 1: maximum height = 40
Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342

思路

  题意:

  有n(n≤30)中立方体,每种都有无穷多个。要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽。

  思路:

  矩形嵌套的变形题,将题目信息转化为矩形嵌套来做。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 35;
struct Node{
	int len,wid,hei;
}node[maxn*3];

bool cmp(struct Node x,struct Node y)
{
	if (x.len == y.len)	return x.wid < y.wid;
	else	return x.len < y.len;
}

int main()
{
	int N,Case = 0;
	while (~scanf("%d",&N) && N)
	{
		int x,y,z,p = 0,res = 0;
		int dp[maxn*3];
		for (int i = 0;i < N;i++)
		{
			scanf("%d%d%d",&x,&y,&z);
			node[p].len = x>y?x:y;node[p].wid = x<y?x:y;node[p++].hei = z;
			node[p].len = x>z?x:z;node[p].wid = x<z?x:z;node[p++].hei = y;
			node[p].len = y>z?y:z;node[p].wid = y<z?y:z;node[p++].hei = x;
		}
		sort(node,node+p,cmp);
		for (int i = 0;i < p;i++)
		{
			dp[i] = node[i].hei;
			for (int j = 0;j < i;j++)
			{
				if (node[i].len > node[j].len && node[i].wid > node[j].wid && dp[i] < dp[j] + node[i].hei)
				{
					dp[i] = dp[j] + node[i].hei;
				}
			}
			res = max(res,dp[i]);
		}
		printf("Case %d: maximum height = %d\n",++Case,res);
	}
	return 0;
}

  

// UVa437 The Tower of Babylon
// Rujia Liu
// 算法:DAG上的最长路,状态为(idx, k),即当前顶面为立方体idx,其中第k条边(排序后)为高
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define REP(i,n) for(int i = 0; i < (n); i++)

const int maxn = 30 + 5;
int n, blocks[maxn][3], d[maxn][3];

void get_dimensions(int* v, int b, int dim)
{
    int idx = 0;
    REP(i,3) if(i != dim) v[idx++] = blocks[b][i];
}

int dp(int i, int j)
{
    int& ans = d[i][j];
    if(ans > 0) return ans;
    ans = 0;
    int v[2], v2[2];
    get_dimensions(v, i, j);
    REP(a,n) REP(b,3)
    {
        get_dimensions(v2, a, b);
        if(v2[0] < v[0] && v2[1] < v[1]) ans = max(ans, dp(a,b));
    }
    ans += blocks[i][j];
    return ans;
}

int main()
{
    int kase = 0;
    while(scanf("%d", &n) == 1 && n)
    {
        REP(i,n)
        {
            REP(j,3) scanf("%d", &blocks[i][j]);
            sort(blocks[i], blocks[i]+3);
        }
        memset(d, 0, sizeof(d));
        int ans = 0;
        REP(i,n) REP(j,3) ans = max(ans, dp(i,j));
        printf("Case %d: maximum height = %d\n", ++kase, ans);
    }
    return 0;
}

  

UVa 437 The Tower of Babylon(经典动态规划)的更多相关文章

  1. UVa 437 The Tower of Babylon

    Description   Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...

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

     题意  给你n种长方体  每种都有无穷个  当一个长方体的长和宽都小于还有一个时  这个长方体能够放在还有一个上面  要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法  比較不好控制 ...

  3. UVA 437 The Tower of Babylon(DAG上的动态规划)

    题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...

  4. UVA 437 "The Tower of Babylon" (DAG上的动态规划)

    传送门 题意 有 n 种立方体,每种都有无穷多个. 要求选一些立方体摞成一根尽量高的柱子(在摞的时候可以自行选择哪一条边作为高): 立方体 a 可以放在立方体 b 上方的前提条件是立方体 a 的底面长 ...

  5. DP(DAG) UVA 437 The Tower of Babylon

    题目传送门 题意:给出一些砖头的长宽高,砖头能叠在另一块上要求它的长宽都小于下面的转头的长宽,问叠起来最高能有多高 分析:设一个砖头的长宽高为x, y, z,那么想当于多了x, z, y 和y, x, ...

  6. UVA - 437 The Tower of Babylon(dp-最长递增子序列)

    每一个长方形都有六种放置形态,其实可以是三种,但是判断有点麻烦直接用六种了,然后按照底面积给这些形态排序,排序后就完全变成了LIS的问题.代码如下: #include<iostream> ...

  7. UVA 437 The Tower of Babylon巴比伦塔

    题意:有n(n≤30)种立方体,每种有无穷多个.要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽. 评测地址:http:/ ...

  8. UVA437-The Tower of Babylon(动态规划基础)

    Problem UVA437-The Tower of Babylon Accept: 3648  Submit: 12532Time Limit: 3000 mSec Problem Descrip ...

  9. UVA 427 The Tower of Babylon 巴比伦塔(dp)

    据说是DAG的dp,可用spfa来做,松弛操作改成变长.注意状态的表示. 影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了. #include ...

随机推荐

  1. 如何重现难以重现的bug

    生活中有这么一种现象:如果你关注某些东西,它就会经常出现在你眼前,例如一个不出名的歌手的名字,一种动物的卡通形象,某个非常专业的术语,等等等等.这种现象也叫做“孕妇效应”.还有类似的一种效应叫做“视网 ...

  2. 发布园友设计的新款博客皮肤BlueSky

    园友#a为大家设计了一款“简单.纯粹,一点淡雅,一点宁静”的博客皮肤——BlueSky,欢迎您的享用!感谢#a的精心设计! 如果您有兴趣为大家设计博客皮肤,请将您设计的html/css/images文 ...

  3. ASP.NET Web API 安全验证之摘要(Digest)认证

    在基本认证的方式中,主要的安全问题来自于用户信息的明文传输,而在摘要认证中,主要通过一些手段避免了此问题,大大增加了安全性. 1.客户端匿名的方式请求 (无认证) HTTP/ Unauthorized ...

  4. codevs 4543 treap 模板

    type rec=record lc,rc,v,rnd,size,w,fa:longint; end; var n,root,tot,ans,opt,x,i,po:longint; tr:array[ ...

  5. 东大OJ-5到100000000之间的回文质数

    1217: VIJOS-P1042 时间限制: 0 Sec  内存限制: 128 MB 提交: 78  解决: 29 [提交][状态][讨论版] 题目描述         有一天,雄霸传授本人风神腿法 ...

  6. 屠龙之路_坚持就是胜利_NinthDay

    狭小的空间里,屠龙天团的少年们和alpha恶龙苦苦对峙了一夜!这恶龙还挺能熬的,厉害了word龙.无奈之下,五更天的时候,我们的屠龙少年只能先退出战场养精蓄锐,为了不让恶龙再次逍遥法外,机智的屠龙队长 ...

  7. virtio 半虚拟化驱动

    半虚拟化驱动 5.1.1 virtio概述 KVM是必须使用硬件虚拟化辅助技术(如Intel VT-x.AMD-V)的hypervisor,在CPU运行效率方面有硬件支持,其效率是比较高的:在有Int ...

  8. SpringMVC自定义视图 Excel视图和PDF视图

    一.自定义视图-Excel视图 1.Maven依赖 引入POI <dependency> <groupId>org.apache.poi</groupId> < ...

  9. [转]java web简单权限管理设计

    原文地址:http://blog.csdn.net/zwx19921215/article/details/44467099 最近在做一个网站类型项目,主要负责后台,ui框架选型为jquery eas ...

  10. oracle中SET DEFINE意思

    et define off关闭替代变量功能 在SQL*Plus中默认的"&"表示替代变量,也就是说,只要在命令中出现该符 号,SQL*Plus就会要你输入替代值.这就意味着 ...