题目

有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(巴比伦塔)的更多相关文章

  1. ACM - 动态规划 - UVA437 The Tower of Babylon

    UVA437 The Tower of Babylon 题解 初始时给了 \(n\) 种长方体方块,每种有无限个,对于每一个方块,我们可以选择一面作为底.然后用这些方块尽可能高地堆叠成一个塔,要求只有 ...

  2. [动态规划]UVA437 - The Tower of Babylon

     The Tower of Babylon  Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many d ...

  3. Uva437 The Tower of Babylon

    https://odzkskevi.qnssl.com/5e1fdf8cae5d11a8f572bae96d6095c0?v=1507521965 Perhaps you have heard of ...

  4. 【DP】【Uva437】UVA437 The Tower of Babylon

    传送门 Description Input Output Sample Input Sample Output Case : maximum height = Case : maximum heigh ...

  5. UVA 427 The Tower of Babylon 巴比伦塔(dp)

    据说是DAG的dp,可用spfa来做,松弛操作改成变长.注意状态的表示. 影响决策的只有顶部的尺寸,因为尺寸可能很大,所以用立方体的编号和高的编号来表示,然后向尺寸更小的转移就行了. #include ...

  6. UVA 437 The Tower of Babylon巴比伦塔

    题意:有n(n≤30)种立方体,每种有无穷多个.要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽. 评测地址:http:/ ...

  7. UVa 437 The Tower of Babylon(经典动态规划)

    传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...

  8. DAG 动态规划 巴比伦塔 B - The Tower of Babylon

    题目:The Tower of Babylon 这是一个DAG 模型,有两种常规解法 1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归 2.递推法 方法一:记忆化搜索 #include < ...

  9. uva The Tower of Babylon[LIS][dp]

    转自:https://mp.weixin.qq.com/s/oZVj8lxJH6ZqL4sGCXuxMw The Tower of Babylon(巴比伦塔) Perhaps you have hea ...

随机推荐

  1. Scaleform 4.3 (1)

    //可变参数传输 GFxValue args[3], result; args[0].SetNumber(i); args[1].SetString("test"); args[2 ...

  2. 内部排序->选择排序->堆排序

    文字描述 堆排序中,待排序数据同样可以用完全二叉树表示, 完全二叉树的所有非终端结点的值均不大于(或小于)其左.右孩子结点的值.由此,若序列{k1, k2, …, kn}是堆,则堆顶元素(或完全二叉树 ...

  3. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  4. No converter found for return value of type

    springMVC请求接口的时候报500  No converter found for return value of type 原因:这是因为springmvc默认是没有对象转换成json的转换器 ...

  5. 递归、嵌套for循环、map集合方式实现树形结构菜单列表查询

    有时候, 我们需要用到菜单列表,但是怎么样去实现一个菜单列表的编写呢,这是一重要的问题. 比如我们需要编写一个树形结构的菜单,那么我们可以使用JQuery的zTree插件:http://www.tre ...

  6. 关于eclipse调试时程序控制台不能自动打开

      对于这个程序,在刚开始的时候,没有敲上22,29,33行的打印语句时,在调试的时候不会自动弹开控制台,所以一直在怀疑代码可能出错了.因此可以自己手动打开,但是如果敲上那些代码,系统可以自动弹开控制 ...

  7. 【JMeter】插件安装

    安装插件的方法有两种,一种是传统的方式,即官网下载,本地配置,重启jmeter.现在有一种快捷的方法可以自定义安装插件-插件管理器 JMeter 插件管理器的使用方法很简单:不要手动安装各种插件,它提 ...

  8. AdvStringGrid常用操作

    AdvStringGrid1.Options:=[goEditing]; then CanEdit := True;end; //设置单元格对齐方式 procedure TForm1.AdvStrin ...

  9. cefglue Flash

    用户计算机必须安装Adobe Flash组件才能播放动画,关于这点,找到3个解决方案: 方法一:安装NPAPI版本的Flash组件(非IE版)之后,才能播放动画.访问 http://get.adobe ...

  10. 装系统w7、ubuntu、centos等系统(一)

    装w7系统准备 1.从老毛桃u盘启动盘制作工具_老毛桃u盘装系统_老毛桃pe_老毛桃官网下载装机版 2.一个正常使用的U盘,但容量大于4G,并且插入电脑保持连接 3.老毛桃装机版选择U盘启动-> ...