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 ...
随机推荐
- CSP中的选择
P ∩ Q (P or Q) 由机器做出选择,环境无法控制,设计软件时只实现一个即可 P[]Q一般选择(Genral choice) 环境可以控制选择P或Q,若P不可接受这个动作,则执行Q,若Q不可接 ...
- phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法
phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法 实这个很简单的只要更改php.ini里三个配置即可.(见下面加粗部分,改成你自己的需求即可) ; Maximum allo ...
- 不正常退出vim产生swp文件的解决方法
vi -r README.txt恢复文件,这样上次意外退出没有保存的修改,就会覆盖文件. vi -r查看生成的交换文件 rm .README.txt.swp删除交换文件 搞定!下次打开文件就可以正常编 ...
- 加快Gradle的构建过程
Gradle配置文件中加入守护进程 org.gradle.daemon=true 这个守护进程是在第一次编译时才开启进程进行编译,之后的编译将不再开启进程重新编译,这样以减小编译的速度
- 连接SQLsever数据库在C#中不能操作的问题
最近小组成员在用C#连接数据库进行操作的时候,总是注册不起用户,提示为sql.client值不能为NULL,经过了一上午的百度查询,讨论,总是找不到问题所在,不得已去问了老师,老师是专业的软件工程师, ...
- 【IDE】我的花里胡哨VS
我的 VS2017 效果图,花里胡哨但十分养眼,利于C/C++ Coding~ 一.主题设置 工具 → 扩展和更新 下载插件 Color Theme Editor for Visual Studio ...
- 添加浏览器back操作时的响应事件
https://blog.csdn.net/xcqingfeng/article/details/70800118 $(function(){ pushHistory(); window.addEve ...
- linux配置redis三种启动方式
下载 wget http://download.redis.io/releases/redis-4.0.9.tar.gz 解压 tar -xzf redis-4.0.9.tar.gz -C /usr/ ...
- Python *Mix_w3
1.基本数据类型(int,bool,str) int 整数 str 字符串. 一般不存放大量的数据 bool 布尔值. 用来判断. True, False list 列表.用来存放大量数据, []表示 ...
- Linux中的#和$区别
[#]代表 root权限[$]代表普通用户