UVA 437 "The Tower of Babylon" (DAG上的动态规划)
题意
有 n 种立方体,每种都有无穷多个。
要求选一些立方体摞成一根尽量高的柱子(在摞的时候可以自行选择哪一条边作为高);
立方体 a 可以放在立方体 b 上方的前提条件是立方体 a 的底面长宽分别严格小于立方体 b 的底面长宽;
求最大高度;
思路
对于立方体 a(x,y,z)((长,宽,高)),因为每个立方体都有无穷个,所以 a 要拆成三个;
a1(x,y,z) , a2(x,z,y) , a3(y,z,x) 即分别以 z,y,x 作为高;
对于任意两个立方体 a,b ,如果 b 可以放在 a 的上方,那么连一条边 a->b,意思是 a 的上方可以放 b;
预处理出所有的点,以此构图,然后求出高最大的那条路经的高,输出即可;
AC代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
const int maxn=; int n;
int num;
int head[maxn];
struct Edge
{
int to;
int next;
}G[maxn*maxn];
void addEdge(int u,int v)
{
G[num]={v,head[u]};
head[u]=num++;
}
struct Date
{
int x,y;
}_date[maxn];
ll h[maxn];
ll dp[maxn];///dp[i]:以立方体i为最底层的立方体可以形成的最大高度 ll F(int u)
{
ll &ans=dp[u];
if(ans != -)
return ans;
ans=h[u];
for(int i=head[u];~i;i=G[i].next)
{
int v=G[i].to;
ans=max(ans,F(v)+h[u]);
}
return ans;
}
bool isSat(int i,int j)
{
return _date[i].x > _date[j].x && _date[i].y > _date[j].y ||
_date[i].x > _date[j].y && _date[i].y > _date[j].x ? true:false;
}
ll Solve()
{
///最多可能加入(3*n)^2条边
///G数组不要开小了
for(int i=;i <= *n;++i)
for(int j=;j <= *n;++j)
if(isSat(i,j))///判断立方体j是否可以放在立方体i上
addEdge(i,j);
mem(dp,-);
for(int i=;i <= *n;++i)///以i作为底层的立方体
dp[i]=F(i); return *max_element(dp+,dp+*n+);
}
void Init()
{
num=;
mem(head,-);
}
int main()
{
int kase=;
while(~scanf("%d",&n) && n)
{
Init();
for(int i=;i <= n;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z); ///第i个立方体变为三个编号为i*3,i*3-1,i*3-2的立方体
int cnt=i*;
_date[cnt]={x,y};
h[cnt--]=z; _date[cnt]={x,z};
h[cnt--]=y; _date[cnt]={y,z};
h[cnt--]=x;
}
printf("Case %d: maximum height = %lld\n",++kase,Solve());
}
return ;
}
UVA 437 "The Tower of Babylon" (DAG上的动态规划)的更多相关文章
- UVA 437 The Tower of Babylon(DAG上的动态规划)
题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...
- 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种放法 比較不好控制 ...
- DP(DAG) UVA 437 The Tower of Babylon
题目传送门 题意:给出一些砖头的长宽高,砖头能叠在另一块上要求它的长宽都小于下面的转头的长宽,问叠起来最高能有多高 分析:设一个砖头的长宽高为x, y, z,那么想当于多了x, z, y 和y, x, ...
- UVA - 437 The Tower of Babylon(dp-最长递增子序列)
每一个长方形都有六种放置形态,其实可以是三种,但是判断有点麻烦直接用六种了,然后按照底面积给这些形态排序,排序后就完全变成了LIS的问题.代码如下: #include<iostream> ...
- UVA 437 The Tower of Babylon巴比伦塔
题意:有n(n≤30)种立方体,每种有无穷多个.要求选一些立方体摞成一根尽量高的柱子(可以自行选择哪一条边作为高),使得每个立方体的底面长宽分别严格小于它下方立方体的底面长宽. 评测地址:http:/ ...
- UVa 103 Stacking Boxes --- DAG上的动态规划
UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...
- UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)
传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...
随机推荐
- FJWC2018
晚上水到8:40,感觉药丸. 把电脑带回寝室,大半夜敲键盘…… bzoj5254红绿灯 泰迪每天都要通过一条路从家到学校,这条路的起点是泰迪家,终点则是学校. 这条路中间还有n个路口,从第i-1个路口 ...
- 深入浅出Cocoa之类与对象【转】
最近打算写一些ObjC中比较底层的东西,尤其是 runtime 相关的.苹果已经将 ObjC runtime 代码开源了,我们可以从:http://opensource.apple.com/sourc ...
- php 如何生成静态页
PHP文件名:dome.php <?php $string = 1; ob_start(); @readfile("templets/list.html"); $text = ...
- 【JZOJ4816】【NOIP2016提高A组五校联考4】label
题目描述 输入 输出 样例输入 3 2 2 0 1 2 3 3 2 1 3 1 2 3 3 1 1 2 2 3 样例输出 4 2 12 数据范围 样例解释 解法 设f[i][j]为在第i个点填了j的合 ...
- 使用Data Lake Analytics从OSS清洗数据到AnalyticDB
前提 必须是同一阿里云region的Data Lake Analytics(DLA)到AnalyticDB的才能进行清洗操作: 开通并初始化了该region的DLA服务: 开通并购买了Analytic ...
- 在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的
在centos搭建git服务器时,不小心把/home/git目录删除了,我是怎么恢复的 在删除掉/home/git目录后,每次 git push提交时,都让填写密码,烦 第一步:在本地找到id_rsa ...
- Nuxt.js打造旅游网站第3篇_登录页面的编写
主要知识点: 1.使用vuex/store管理数据 2.登录注册逻辑 3.Nuxt的本地存储 1.登录页面 1.1登录页面布局 替换pages/user/login.vue的代码如下 <temp ...
- 修改UISearchBar背景
转载:http://blog.csdn.net/favormm/archive/2010/11/30/6045463.aspx UISearchBar是由两个subView组成的,一个是UISearc ...
- protobuf_1
我使用的是最新版本的protobuf(protobuf-2.6.1),编程工具使用VS2010.简单介绍下google protobuf: google protobuf 主要用于通讯,是google ...
- 命名分组(?<name>....)
捕获组分为: 普通捕获组(Expression) 命名捕获组(?Expression) 普通捕获组 从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始. ...