转: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. 201521123115《Java程序设计》第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E re ...

  2. [BT5]信息收集1-2 Dnsmap

    0.工具介绍 dnsmap is mainly meant to be used by pentesters during the information gathering/enumeration ...

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

    1. 本周学习总结 2. 书面作业 将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示. 1 ...

  4. python只re模块

    while True: phone_number=input('please input your phone number:') if len(phone_number)==11 \ and pho ...

  5. Mybatis映射文件处理特殊字符【转发】

    该博文下的方法就非常好了! http://blog.csdn.net/zheng0518/article/details/10449549

  6. OSGi-入门篇之模块层(02)

    1 什么是模块化 模块层是OSGi框架中最基础的一部分,其中Java的模块化特性在这一层得到了很好的实现.但是这种实现与Java本身现有的一些模块化特性又有明显的不同. 在OSGi中模块的定义可以参考 ...

  7. Java并发之CyclicBarrier、CountDownLatch、Phaser

    在Java多线程编程中,经常会需要我们控制并发流程,等其他线程执行完毕,或者分阶段执行.Java在1.5的juc中引入了CountDownLatch和CyclicBarrier,1.7中又引入了Pha ...

  8. mvc一对多模型表单的快速构建

    功能需求描述 Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单.如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?) A2:拆分多个模型,映射 ...

  9. 【京东账户】——Mysql/PHP/Ajax爬坑之页头页尾加载

    一.引言 实现京东的账户项目,有一个小功能,页头页尾加载.要用到的是Apach环境,Mysql.PHP以及Ajax. 二.实现 原理: 用php文件分别写一个的页头和一个页尾,放在前后两个div里. ...

  10. SqlHelper工具类

    public class SqlHlper { public static readonly string constr = ConfigurationManager.ConnectionString ...