UVa437 The Tower of Babylon(巴比伦塔)
题目
有n(n<=30)种立方体,每种有无穷多个,摞成尽量高的柱子,要求上面的立方体要严格小于下面的立方体.
原题链接
分析
顶面的大小会影响后续的决策,但不能直接用d[a][b]来表示,因为可能有多个立方体长宽相等,因此用d[i][j](i<n,j<3)表示第i个立方体的第j条边,为了方便比较大小,边按照从小大到排序.
每增加一个立方体后顶面的长宽都会严格减小,因此是一个DAG图上的最长路问题.
AC代码
#include "bits/stdc++.h"
using namespace std;
const int maxn = 35;
int n;
int blocks[maxn][3]; //存储第maxn个方块的3条边,且边是有序的
int d[maxn][3];
//得到第b个方块除了dim的两个高度
void get_dimensions(int *v, int b, int dim){
int idx = 0;
for(int i=0;i<3;i++){
if(i != dim)
v[idx++] = blocks[b][i];
}
}
//在第i个方块上,以第j个边为高最多可以达到的高度
int dp(int i, int j){
if(d[i][j]>0) return d[i][j];
d[i][j]=0;
int v1[2], v2[2];
get_dimensions(v1, i, j);
for(int a=0;a<n;a++){
for(int b=0;b<3;b++){
get_dimensions(v2, a, b);
if(v2[0]<v1[0] && v2[1]<v1[1]) //v2可以放到v1上面
d[i][j]=max(d[i][j], dp(a,b)); //
}
}
d[i][j]+=blocks[i][j]; //加上本身的高度
return d[i][j];
}
int main(int argc, char const *argv[])
{
int kase = 0, i, j;
while(cin >> n && n){
for(i=0;i<n;i++){
for(j=0;j<3;j++){
cin >> blocks[i][j];
}
sort(blocks[i], blocks[i]+3);
}
// cout << "q1";
memset(d, 0, sizeof(d));
int ans = 0;
for(i=0;i<n;i++){
for(j=0;j<3;j++){
ans = max(ans, dp(i,j));
}
}
cout << "Case " << ++kase << ": maximum height = " << ans << endl;
}
return 0;
}
UVa437 The Tower of Babylon(巴比伦塔)的更多相关文章
- 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 ...
- Uva437 The Tower of Babylon
https://odzkskevi.qnssl.com/5e1fdf8cae5d11a8f572bae96d6095c0?v=1507521965 Perhaps you have heard of ...
- 【DP】【Uva437】UVA437 The Tower of Babylon
传送门 Description Input Output Sample Input Sample Output Case : maximum height = Case : maximum heigh ...
- UVA 427 The Tower of Babylon 巴比伦塔(dp)
据说是DAG的dp,可用spfa来做,松弛操作改成变长.注意状态的表示. 影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了. #include ...
- UVA 437 The Tower of Babylon巴比伦塔
题意:有n(n≤30)种立方体,每种有无穷多个.要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽. 评测地址:http:/ ...
- UVa 437 The Tower of Babylon(经典动态规划)
传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...
- DAG 动态规划 巴比伦塔 B - The Tower of Babylon
题目:The Tower of Babylon 这是一个DAG 模型,有两种常规解法 1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归 2.递推法 方法一:记忆化搜索 #include < ...
- uva The Tower of Babylon[LIS][dp]
转自:https://mp.weixin.qq.com/s/oZVj8lxJH6ZqL4sGCXuxMw The Tower of Babylon(巴比伦塔) Perhaps you have hea ...
随机推荐
- Scaleform 4.3 (1)
//可变参数传输 GFxValue args[3], result; args[0].SetNumber(i); args[1].SetString("test"); args[2 ...
- 内部排序->选择排序->堆排序
文字描述 堆排序中,待排序数据同样可以用完全二叉树表示, 完全二叉树的所有非终端结点的值均不大于(或小于)其左.右孩子结点的值.由此,若序列{k1, k2, …, kn}是堆,则堆顶元素(或完全二叉树 ...
- 洛谷P3354 Riv河流 [IOI2005] 树型dp
正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...
- No converter found for return value of type
springMVC请求接口的时候报500 No converter found for return value of type 原因:这是因为springmvc默认是没有对象转换成json的转换器 ...
- 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询
有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...
- 关于eclipse调试时程序控制台不能自动打开
对于这个程序,在刚开始的时候,没有敲上22,29,33行的打印语句时,在调试的时候不会自动弹开控制台,所以一直在怀疑代码可能出错了.因此可以自己手动打开,但是如果敲上那些代码,系统可以自动弹开控制 ...
- 【JMeter】插件安装
安装插件的方法有两种,一种是传统的方式,即官网下载,本地配置,重启jmeter.现在有一种快捷的方法可以自定义安装插件-插件管理器 JMeter 插件管理器的使用方法很简单:不要手动安装各种插件,它提 ...
- AdvStringGrid常用操作
AdvStringGrid1.Options:=[goEditing]; then CanEdit := True;end; //设置单元格对齐方式 procedure TForm1.AdvStrin ...
- cefglue Flash
用户计算机必须安装Adobe Flash组件才能播放动画,关于这点,找到3个解决方案: 方法一:安装NPAPI版本的Flash组件(非IE版)之后,才能播放动画.访问 http://get.adobe ...
- 装系统w7、ubuntu、centos等系统(一)
装w7系统准备 1.从老毛桃u盘启动盘制作工具_老毛桃u盘装系统_老毛桃pe_老毛桃官网下载装机版 2.一个正常使用的U盘,但容量大于4G,并且插入电脑保持连接 3.老毛桃装机版选择U盘启动-> ...