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 ...
随机推荐
- [dpdk] TSC , HPET, Timer, Event Timer,RDTSCP
关于dpdk timer跨越CPU core调度的准确性问题 首先dpdk的timer接口里边使用 cpu cycle来比较时间.根据之前的内容 [dpdk] dpdk --lcores参数 当一个E ...
- Flink – Stream Task执行过程
Task.run if (invokable instanceof StatefulTask) { StatefulTask op = (StatefulTask) invokable; op.set ...
- EF-CodeFirst-数据迁移
数据迁移 之前说到Code-First中有不同的数据库初始化策略,如CreateDatabaseIfNotExists,DropCreateDatabaseIfModelChanges和DropCre ...
- 关于 Data URI Scheme -- data:image/jpg;base64
转载一篇大神的文章 大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqA ...
- JavaScript学习(四)
- MySQL 5.5 服务器变量详解(一)
autocommit={0|1} 设定MySQL事务是否自动提交,1表示立即提交,0表示需要显式提交.作用范围为全局或会话,可用于配置文件中(但在5.5.8之前的版本中不可用于配置文件),属于动态变量 ...
- if __name__==__main__:的应用
1. if __name__==__main__:代码的作用 python的文件有两种使用的方法:(1)直接作为脚本执行:(2)import到其他的python脚本中被调用(模块重用)执行: 因此if ...
- 鼠标 DPI与CPI
何为dpi: dpi英文全称是“dots per inch”,直译为“每英寸像素”,意思是每英寸的像素数.(1 英寸=2.54cm),是指鼠标内的解码装置所能辨认每英寸长度内像素数.(屏幕上最小单位是 ...
- @property用法总结
1.当方法需要传入别的参数时,不能定义成@property. 比如_table(self, owner)
- js中实现IE的打印预览
HTML中添加:<object id="WebBrowser" classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 widt ...