The Tower of Babylon

Time Limit: 1000ms
Memory Limit: 65536KB

This problem will be judged on PKU. Original ID: 2241
64-bit integer IO format: %lld      Java class name: Main

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 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

Source

 
解题:动态规划,很像LIS
 #include <bits/stdc++.h>
using namespace std;
const int maxn = ;
struct Cube{
int x,y,z;
Cube(int a = ,int b = ,int c = ){
x = a;
y = b;
z = c;
}
bool operator<(const Cube &t) const{
return x*y > t.x*t.y;
}
}cube[maxn];
int dp[maxn];
int main(){
int n,tot,x,y,z,kase = ;
while(scanf("%d",&n),n){
for(int i = tot = ; i < n; ++i){
scanf("%d%d%d",&x,&y,&z);
cube[tot++] = Cube(x,y,z);
cube[tot++] = Cube(y,z,x);
cube[tot++] = Cube(x,z,y);
}
memset(dp,,sizeof dp);
sort(cube,cube+tot);
int maxHeight = ;
for(int i = ; i < tot; ++i){
dp[i] = cube[i].z;
for(int j = i-; j >= ; --j){
if(cube[j].x > cube[i].x && cube[j].y > cube[i].y)
dp[i] = max(dp[i],dp[j] + cube[i].z);
if(cube[j].y > cube[i].x && cube[j].x > cube[i].y)
dp[i] = max(dp[i],dp[j] + cube[i].z);
}
maxHeight = max(maxHeight,dp[i]);
}
printf("Case %d: maximum height = %d\n",kase++,maxHeight);
}
return ;
}

最新文章

  1. Creating a Clean, Minimal-Footprint ASP.NET WebAPI Project with VS 2012 and ASP.NET MVC 4
  2. 8.Java格式化输出
  3. [leetcode] 题型整理之二叉树
  4. 《linux内核设计与实现》读书笔记第十七章
  5. Postman - HTTP接口测试工具
  6. Wireshark分析非标准端口号流量
  7. .net 程序集自动生成版本号
  8. Redis单机版安装与部署
  9. The Automated Testing Handbook 自动化测试手册简介
  10. MVC笔记
  11. 初探JavaScript魅力(三)
  12. linux下查看cpu物理个数和逻辑个数 - chw1989的专栏 - 博客频道 - CSDN.NET
  13. asp.net 下的中文分词检索工具 - jieba.net
  14. 01 JVM 从入门到实战 | 什么是 JVM
  15. phpmock测试
  16. [NOIP2014D1]
  17. Java-this
  18. pythonDjango开发-安装第三方插件
  19. UVA-1612 Guess (贪心)
  20. pythonNet day07

热门文章

  1. Devexpress控件使用二:barManager
  2. Struts1、Struts2、Hibernate、Spring框架工作原理介绍
  3. js中es5 使用call方法继承实现 1.0
  4. 妙用$.extend
  5. React显示文件夹中SVG
  6. Java默认方法
  7. Linux 文件系统挂载
  8. [SDOI2008]郁闷的小J(分块)
  9. 题解 P3128 【[USACO15DEC]最大流Max Flow】
  10. 【BZOJ 1257】[CQOI2007]余数之和