UVa437,The Tower of Babylon
转: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的更多相关文章
- Uva437 The Tower of Babylon
https://odzkskevi.qnssl.com/5e1fdf8cae5d11a8f572bae96d6095c0?v=1507521965 Perhaps you have heard of ...
- ACM - 动态规划 - UVA437 The Tower of Babylon
UVA437 The Tower of Babylon 题解 初始时给了 \(n\) 种长方体方块,每种有无限个,对于每一个方块,我们可以选择一面作为底.然后用这些方块尽可能高地堆叠成一个塔,要求只有 ...
- [动态规划]UVA437 - The Tower of Babylon
The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many d ...
- UVa 437 The Tower of Babylon(经典动态规划)
传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...
- UVa 437 The Tower of Babylon
Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...
- POJ2241——The Tower of Babylon
The Tower of Babylon Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2207 Accepted: 1 ...
- UVA437-The Tower of Babylon(动态规划基础)
Problem UVA437-The Tower of Babylon Accept: 3648 Submit: 12532Time Limit: 3000 mSec Problem Descrip ...
- DAG 动态规划 巴比伦塔 B - The Tower of Babylon
题目:The Tower of Babylon 这是一个DAG 模型,有两种常规解法 1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归 2.递推法 方法一:记忆化搜索 #include < ...
- HOJ 1438 The Tower of Babylon(线性DP)
The Tower of Babylon My Tags Cancel - Seperate tags with commas. Source : University of Ulm Internal ...
随机推荐
- 201521123019 《java程序设计》 第13周学习总结
1. 本章学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 访问cec ...
- JVM(三)内存回收(一)
最近花了相当长一段时间在看Hotspot JVM的GC和内存分配,本节先总结和回顾一下内存回收的相关知识点,内存的分配放到下节再讨论. 一.什么是JVM的GC GC即Garbage Collectio ...
- python基础之元组,集合
一.元组 为何要有元组,存放多个值,元组不可变,更多的是用来做查询 t=(,[,],,)) #t=tuple((,[,],,))) print(type(t)) 元组可以作为字典的key d={(,, ...
- bootStrap事例代码
最近在学bootStrap,在慕课网中有这么一个例子-.感觉以后会用到这些代码.保存起来. <!DOCTYPE html> <html lang="zh-cn"& ...
- u盘分区装机版
第一步:制作启动U盘前的软硬件准备 .准备一个最好大于2G的U盘,并先备份好里面的数据,防止接下来需要清空U盘的数据而出现丢失重要文件: 2.下载U盘启动盘制作工具6.1软件,直接放在桌面,方便接下来 ...
- 在 Ubuntu 上安装 MongoDB
在 Ubuntu 上安装 MongoDB 运行下列命令,导入 MongoDB 公开 GPG 键: sudo apt-key adv --keyserver hkp://keyserver.ubuntu ...
- 树莓派3 B+ 的摄像头简单使用(video-streamer)
一.首先在某东上购买树莓派摄像头 我的买的硬件张这个样子的(CSI接口摄像头): 正视图 ...
- pycharm 2017新建文件添加编码方式等
file->setting->Editor->File and Code Templates->Python Script 添加 #!/usr/bin/python3# -*- ...
- Kindle 推送教程:教你用电子邮箱推送电子书
Kindle 推送是什么意思?如何通过电子邮件附件推送?或许刚刚接触 Kindle 的朋友对这个概念不是很清楚,其实所谓 Kindle 推送是指亚马逊提供的一个"Kindle 个人文档服务& ...
- 使用phpmailer插件发邮件失败提示:SMTP -> ERROR: Failed to connect to server: Connection timed out (110) smtp connect() failed;
一个邮件发送问题,整整弄了我一周时间,起因是这样的,之前弄的一个网站,需要在邮箱里面认证之后才可以注册成功.网站上线了差不多一年之后,客户突然跟我说,网站不能注册了,然后我就查看了一下代码. 发现报这 ...