题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度。

方法1,建图求解,可以把问题转化成求DAG上的最长路问题

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = ;
struct Node{
int x;
int y;
int z;
Node(int x,int y,int z):x(x),y(y),z(z){}
Node(){}
bool operator < (const Node &n)const{
return (x < n.x&& y < n.y) || (x < n.y&& y < n.x);
}
};
vector<Node> vec;
int n;
int d[maxn*];
int G[maxn*][maxn*];
int dp(int i,int h){
int & ans = d[i];
if(ans>)return ans;
ans = h;
for(int j = ; j < n*; j++)if(G[i][j]){
ans = max(ans,dp(j,vec[j].z)+h);
}
return ans;
}
int main(){
int cnt = ;
while(scanf("%d",&n)==&&n){
vec.clear();
memset(G,,sizeof(G));
memset(d,,sizeof(d));
for(int i = ; i< n; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
vec.push_back(Node(x,y,z));
vec.push_back(Node(x,z,y));
vec.push_back(Node(z,y,x));
}
sort(vec.begin(),vec.end()); for(int i = ;i < n*; i++){
for(int j = ; j < n*; j++){
if(vec[i] < vec[j])
G[i][j] = ;
}
}
int result = -;
for(int i = ; i < n* ;i++){
result = max(result,dp(i,vec[i].z));
}
printf("Case %d: maximum height = %d\n",++cnt,result);
}
return ;
}

方法2,转化成最长递增子序列问题求解

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = ;
struct Node{
int x;
int y;
int z;
Node(int x,int y,int z):x(x),y(y),z(z){}
Node(){}
bool operator < (const Node &n)const{
return (x < n.x&& y < n.y) || (x < n.y&& y < n.x);
}
};
bool cmp(Node a,Node b){
return a.x*a.y < b.x*b.y;
}
vector<Node> vec;
int n;
int d[maxn*];
int LIS(int n){
//d[i] = max{hi,d[j]}i>j ,A[i]>A[j]
int t = ;
for(int i = ; i < n*; i++){
d[i] = vec[i].z;
for(int j = ; j < i; j++)
if(vec[j] < vec[i])
d[i] = max(d[i],d[j]+vec[i].z);
if(d[i] > t) t = d[i];
}
return t;
}
int main(){
int cnt = ;
while(scanf("%d",&n)==&&n){
vec.clear();
memset(d,,sizeof(d));
for(int i = ; i< n; i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
vec.push_back(Node(x,y,z));
vec.push_back(Node(x,z,y));
vec.push_back(Node(z,y,x));
}
sort(vec.begin(),vec.end(),cmp);
printf("Case %d: maximum height = %d\n",++cnt,LIS(n));
}
return ;
}

方法二要注意一点,我sort序列的时候用了一个cmp函数,他是根据立方体的底面积对立方体进行排序的。为什么不采用和方法一一样的排序方式呢?

因为a.x <b.x&&a.y<b.y

或 a.y<b.x&&a.x<b.y

=>Sa <Sb

所以在塔上面的立方体的底面积一定比下面的小。

UVA 437 The Tower of Babylon(DAG上的动态规划)的更多相关文章

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

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

  2. UVa 437 The Tower of Babylon

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

  3. UVa 437 The Tower of Babylon(DP 最长条件子序列)

     题意  给你n种长方体  每种都有无穷个  当一个长方体的长和宽都小于还有一个时  这个长方体能够放在还有一个上面  要求输出这样累积起来的最大高度 由于每一个长方体都有3种放法  比較不好控制 ...

  4. UVA 437 "The Tower of Babylon" (DAG上的动态规划)

    传送门 题意 有 n 种立方体,每种都有无穷多个. 要求选一些立方体摞成一根尽量高的柱子(在摞的时候可以自行选择哪一条边作为高): 立方体 a 可以放在立方体 b 上方的前提条件是立方体 a 的底面长 ...

  5. DP(DAG) UVA 437 The Tower of Babylon

    题目传送门 题意:给出一些砖头的长宽高,砖头能叠在另一块上要求它的长宽都小于下面的转头的长宽,问叠起来最高能有多高 分析:设一个砖头的长宽高为x, y, z,那么想当于多了x, z, y 和y, x, ...

  6. UVA - 437 The Tower of Babylon(dp-最长递增子序列)

    每一个长方形都有六种放置形态,其实可以是三种,但是判断有点麻烦直接用六种了,然后按照底面积给这些形态排序,排序后就完全变成了LIS的问题.代码如下: #include<iostream> ...

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

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

  8. UVa 103 Stacking Boxes --- DAG上的动态规划

    UVa 103 题目大意:给定n个箱子,每个箱子有m个维度, 一个箱子可以嵌套在另一个箱子中当且仅当该箱子的所有的维度大小全部小于另一个箱子的相应维度, (注意箱子可以旋转,即箱子维度可以互换),求最 ...

  9. UVA 1025 "A Spy in the Metro " (DAG上的动态规划?? or 背包问题??)

    传送门 参考资料: [1]:算法竞赛入门经典:第九章 DAG上的动态规划 题意: Algorithm城市的地铁有 n 个站台,编号为 1~n,共有 M1+M2 辆列车驶过: 其中 M1 辆列车从 1 ...

随机推荐

  1. IP检验字段为啥只检验地址部分

    在首部中的错误比在数据中的错误更重 如:一个错误的地址可能导致分组被投递到错误的主机.许多主机并不检查投递给它们的分组是否 确定是要投递给它们,它们假定网络从来不会把别人的分组包传递给自己.数据不参加 ...

  2. c++ 数字和字符串的相互转换

    需要包含头文件<sstream> 字符串转化为int #include<stdio.h> #include<string.h> #include<iostre ...

  3. Django url处理

    Django如何处理一个请求当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码遵循的算法:1:Django 决定要使用的根URLconf 模块.通常,这 ...

  4. <逆向学习第三天>手动脱FSG壳,修复IAT。

    其实对于简单的壳来说,脱壳常用的方法也无非是那几种,但是每种有每种的好处,具体使用那种方法视情况而定,我今天学习的这个壳很简单,但是重点在于修复IAT. 一.查壳: FSG 2.0的壳. 二.脱壳: ...

  5. ABAP术语-Business Framework Architecture

    Business Framework Architecture 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/29/1019277.html ...

  6. 转:Zookeeper客户端Curator使用详解

    原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...

  7. 编译安装开源免费中文分词scws

    一.SCWS了解一下: SCWS 是 Simple Chinese Word Segmentation 的首字母缩写(即:简易中文分词系统). 这是一套基于词频词典的机械式中文分词引擎,它能将一整段的 ...

  8. Linux系统磁盘管理

    1 Linux磁盘管理体系简介 Linux磁盘管理分为五个步骤:首先在服务器上添加相应的硬盘(如/dev/sda.sdb.sdc等),对全新的服务器(即没有操作系统)做硬RAID0.RAID1.RAI ...

  9. winform Treeview控件使用

    做角色菜单权限时用到treeview控件做树状显示菜单,简单总结了一下用法: 1.在winform窗体中拖入treeview控件,注意修改属性CheckBoxes属性为true,即在节点旁显示复选框 ...

  10. android发布帖子类技术

    最近练习一些关于发布帖子的技术,说来也简单,就学了一点皮毛吧!好了,下面就上代码吧! 首先设计服务器的访问类,大家都知道现在东西都要联网的嘛! JSONParser的类: public class J ...