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 ...
随机推荐
- iOS中的静态库与动态库,区别、制作和使用
如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...
- 转:SAX解析的characters方法被多次调用
原文地址:https://blog.csdn.net/liuxiaoddd/article/details/28885177 android SAX解析的characters方法被多次调用 同理 试用 ...
- iptables及其在路由器上的应用 (待完善)
1. iptables基本定义 Table (表名) Explanation (注释) nat nat表的主要用处是网络地址转换,即Network Address Translation,缩写为NAT ...
- 应用docker化
1)首先安装源代码工具Git. [root@master~]# yum install-y git 2)从GitHub上下载示例的Java应用源代码. [root@master~]# cd/op ...
- 【PyQt5-Qt Designer】添加图片+鼠标点击
添加图片+鼠标点击 graphicsView中添加图片 效果图 添加之后左边1处 生成qrc文件 选择文件右键编译-生成图片的16进制文件 课后作业:
- replace函数的使用(替换单个和全局)
//单个 var aa="1-2-3"; aa=aa.replace(',',"."); console.log(aa); //全局替换 var aa=&quo ...
- java public,default,protected,private区别
温习一下:https://www.cnblogs.com/ldq2016/p/6872420.html
- 前端 HTML form表单标签 input标签 type属性 checkbox 多选框
多选框 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- js计算常见操作
如何实现数字相加 var a = 1, var b = 2, var c = a + b 这样c得出来的解果是12, 使用Number()函数可以解决这个问题,如下 var c = Number(a) ...
- [js]javascript中4种异步
javascript中4种异步: 1.ajax 2.定时器 3.事件绑定 4,回调 定时器 //顺序执行 /* var s = 0; for (var i = 0; i < 10000; i++ ...