转:http://blog.csdn.net/wangtaoking1/article/details/7308275

题意为输入若干种立方体(每种若干个),然后将立方体堆成一个塔,要求接触的两个面下底面的长宽分别严格大于上底面,求塔的最大高度。

将每种立方体的各种摆放形式均视为不同的立方体,并存起来。再将所有立方体按照下底面的面积从小到大排序(因为在塔上面的立方体的底面积一定比下面的小),然后只需求该序列的最大上升子序列的长度即可。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std; struct node //记录每个立方体的长宽高
{
int x,y,z;
void f(int a, int b,int c)
{
x=a; y=b; z=c;
}
}st[];
bool comp(node a, node b) //按立方体的底面积从小到大进行排序
{
if( a.x*a.y <b.x*b.y )
return ;
return ;
}
int n,m, x,y,z,dp[];
int main()
{
int flag =;
while( scanf("%d", &n) &&n )
{
m=;
int i,j;
for( i=; i<n; i++)
{
scanf("%d%d%d", &x, &y, &z);
st[ m++].f(x,y,z); //将6种立方体均保存起来
st[ m++].f(x,z,y);
st[ m++].f(y,z,x);
st[ m++].f(y,x,z);
st[ m++].f(z,x,y);
st[ m++].f(z,y,x);
}
sort( st, st+m, comp);
int t=;
for( i=; i<m; i++) //求最长上升子序列
{
dp[i] =st[i].z;
for( j=; j<i; j++)
if( st[i].x >st[j].x && st[i].y >st[j].y )
dp[i] =max( dp[i], dp[j] +st[i].z);
if( dp[i] >t)
t =dp[i];
}
printf("Case %d: maximum height = %d\n",flag++,t);
}
return ;
}

该方法要比紫薯上提供的方法要好的多。清晰易懂。

题意虽说有若干个立方体,但仔细想想,答案说生成的序列中最多可能包含3个同一个立方体(再仔细想想,应该是两个,但是我们还需要看成3个),故将一个立方体拓展成三个立方体即可。

将所有立方体按照下底面的面积从小到大排序(其实也可以对长度一级排序,对宽度二级排序),然后用if( st[i].x >st[j].x && st[i].y >st[j].y )  判断能否状态转移

UVa437,The Tower of Babylon的更多相关文章

  1. Uva437 The Tower of Babylon

    https://odzkskevi.qnssl.com/5e1fdf8cae5d11a8f572bae96d6095c0?v=1507521965 Perhaps you have heard of ...

  2. ACM - 动态规划 - UVA437 The Tower of Babylon

    UVA437 The Tower of Babylon 题解 初始时给了 \(n\) 种长方体方块,每种有无限个,对于每一个方块,我们可以选择一面作为底.然后用这些方块尽可能高地堆叠成一个塔,要求只有 ...

  3. [动态规划]UVA437 - The Tower of Babylon

     The Tower of Babylon  Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many d ...

  4. UVa 437 The Tower of Babylon(经典动态规划)

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

  5. UVa 437 The Tower of Babylon

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

  6. POJ2241——The Tower of Babylon

    The Tower of Babylon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2207   Accepted: 1 ...

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

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

  8. DAG 动态规划 巴比伦塔 B - The Tower of Babylon

    题目:The Tower of Babylon 这是一个DAG 模型,有两种常规解法 1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归 2.递推法 方法一:记忆化搜索 #include < ...

  9. HOJ 1438 The Tower of Babylon(线性DP)

    The Tower of Babylon My Tags Cancel - Seperate tags with commas. Source : University of Ulm Internal ...

随机推荐

  1. 201521123104 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点 1.2 可选:使用常规方法总结其他上课内容. 1.接口不是类,不能使用new进行实例化; 2.接口可以扩展; 3.接口中可以包含 ...

  2. 201521044091 《Java程序设计》第2周学习总结

    1本章学习总结 (1)一些java的基本语法 (2)java API文件 (3)使用码云管理自己的代码 2.Java Q&A 1)使用Eclipse关联jdk源代码(截图),并查看String ...

  3. 201521123015 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  4. java is-a、has-a和like-a、组合、聚合和继承 两组概念的区别

    is a 代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机.PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性.因此在用 Java语言实现时,应该将PC机和工作站定义成两种 ...

  5. eclipse中svn插件在线安装方式

    SVN插件地址:http://subclipse.tigris.org/update_1.8.x 第一步:eclipse>Help菜单>Install New Software- 第二步: ...

  6. 前端angularJS利用directive实现移动端自定义软键盘的方法

    最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后 ...

  7. 06jQuery-03-选择器查找和过滤

    1.查找 find().parent().prev().next() 通常情况下选择器可以直接定位到我们想要的元素,但是,当我们拿到一个jQuery对象后,还可以以这个对象为基准,进行查找和过滤. 最 ...

  8. flex布局常用属性

    最近喜欢flex布局,它可以完美的实现响应式布局,下边我总结了它的一些常用属性,喜欢的,也可以练习写一下,很好用~~~ 注意:使用了flex布局,对于子元素的float.clear和vertical- ...

  9. R语言画曲线图

    本文以1950年到2010年期间我国的火灾统计数据为例,数据如下所示: (0)加载数据 data<-read.csv("E:\\MyDocument\\p\\Data\\1950~20 ...

  10. vue-chat项目之重构与体验优化

    前言 vue-chat 也就是我的几个月之前写的一个基于vue的实时聊天项目,到目前为止已经快满400star了,注册量也已经超过了1700+,消息量达2000+,由于一直在实习,没有时间对它频繁地更 ...