The Tower of Babylon(UVa 437)
题意:有n种立方体,每种都有无穷多个。选一些正方体摞成一根尽量高的柱子(可以选择任意一条边做高),使得每个立方体的底面长宽分别严格小于它下方的立方柱的底面长宽。
题解:可以套用DAG最长路算法,可以使用二元组来表示每个立方体的每一条边,如v[n][2]就可以用来表示第n个立方块的3个边。
DAG最长路算法:
int dp(int i,int j)
{
int &ans=dist[i][j];
if(ans>) return ans;///表示已经查找过此种状态
ans=;///根据题意赋相应的初值
int v[],v2[];
get_dimensions(v,i,j);///用v数组表示每个方块的长宽高
for(int a=;a<n;a++)
for(int b=;b<;b++){///对每种放置方法进行枚举
get_dimensions(v2,a,b);
if(v2[]<v[]&&v2[]<v[]) ans=max(ans,dp(a,b));///符合条件的方块,进行放置,查看是否最优,此处只是对下一个状态进行最优查找,并未将当前状态的高度计入(因为当前方案不一定可行)
}
ans+=blocks[i][j];///放置此种方块的方案可行,进行放置
return ans;
}
本题代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int maxn=+;
int blocks[maxn][],dist[maxn][],n; void get_dimensions(int* v, int b, int dim) {
int idx = ;
for(int i=;i<;i++)
if(i != dim) v[idx++] = blocks[b][i];///找出每个方块对应的长,宽,高
} int dp(int i,int j)
{
int &ans=dist[i][j];
if(ans>) return ans;///表示已经查找过此种状态
ans=;
int v[],v2[];
get_dimensions(v,i,j);///用v数组表示每个方块的长宽高
for(int a=;a<n;a++)
for(int b=;b<;b++){///对每种放置方法进行枚举
get_dimensions(v2,a,b);
if(v2[]<v[]&&v2[]<v[]) ans=max(ans,dp(a,b));///符合条件的方块,进行放置,查看是否最优,此处只是对下一个状态进行最优查找,并未将当前状态的高度计入(因为当前方案不一定可行)
}
ans+=blocks[i][j];///放置此种方块的方案可行,进行放置
return ans;
} int main()
{
int kase=;
while(~scanf("%d",&n)&&n){
for(int i=;i<n;i++){
for(int j=;j<;j++) scanf("%d",&blocks[i][j]);
sort(blocks[i],blocks[i]+);
}
memset(dist,,sizeof(dist));
int ans=;
for(int i=;i<n;i++)
for(int j=;j<;j++){///枚举每个方块的每种摆放位置
ans=max(ans,dp(i,j));
}
printf("Case %d: maximum height = %d\n",++kase,ans);
}
return ;
}
The Tower of Babylon(UVa 437)的更多相关文章
- The Tower of Babylon UVA - 437 DAG上的动态规划
题目:题目链接 思路:每个方块可以用任意多次,但因为底面限制,每个方块每个放置方式选一个就够了,以x y为底 z 为高,以x z为底 y 为高,以y z为底 x为高,因为数据量很小,完全可以把每一种当 ...
- UVA 437 十九 The Tower of Babylon
The Tower of Babylon Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Subm ...
- 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 ...
- UVa 437 The Tower of Babylon(DP 最长条件子序列)
题意 给你n种长方体 每种都有无穷个 当一个长方体的长和宽都小于还有一个时 这个长方体能够放在还有一个上面 要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法 比較不好控制 ...
- uva The Tower of Babylon[LIS][dp]
转自:https://mp.weixin.qq.com/s/oZVj8lxJH6ZqL4sGCXuxMw The Tower of Babylon(巴比伦塔) Perhaps you have hea ...
- UVA The Tower of Babylon
The Tower of Babylon Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many det ...
- 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 ...
随机推荐
- Ansible 的初步使用
在安装好ansible以后,首先使用ansible -h命令和ansible --version 命令查看帮助手册和版本信息. ansible 配置文件 ansible 的配置文件有多个位置,查找顺序 ...
- Spring错误——Spring AOP——org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
背景:学习切面,测试前置通知功能,xml配置如下 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- CSS: hover选择器的使用
用法1:这个表示的是:当鼠标悬浮在a这个样式上的时候,a的背景颜色设置为黄色 a:hover { background-color:yellow; ...
- PIL PNG格式通道问题的解决方法
近来研究图片的剪切拼接,用到PIL,在打开PNG格式保存为JPEG格式的图片发现报错: import os from PIL import Image im = Image.open(r'E:\wor ...
- Monent.js:强大的日期处理类库
一.介绍及安装 1.1 介绍 Moment.js是一个优秀的JavaScript 日期处理类库. 如果没有Moment.js之类的日期处理库,我们如果需要获得格式化后的日期.往往需要通过new Dat ...
- Angular4.x Event (DOM事件和自定义事件)
Angular组件和DOM元素通过事件与外部进行通信,两者中的事件绑定语法是相同的-(eventName)="expression": <button (click)=&qu ...
- webapi研究说明
首先定义公共的返回对象 /// <summary> /// 返回数据对象 /// </summary> public class ResponseItem<T> { ...
- Django 模板继承
本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载. 让我们通过修改 current_datetime.html 文件,为 current_date ...
- Virtualbox安装增强功能时显示【未能加载虚拟光盘】
我之前在安装Virtualbox时进行到安装增强功能时弹出了一个窗口,提示我"未能加载虚拟光盘到虚拟电脑",如下图 我尝试了多次都是这个情况,经过上网学习我找到了问题所在,我在第一 ...
- Vue mixins(混入)
建立一个公共组件,然后对该组件进行混入继承. 注意会走两个生命周期,谨慎使用 mixins混入,相当于生成new 组件:组件引用,相当与在父组件内开辟了一块单独的空间 mixins适用于,两个有非常相 ...