uva 437 巴比伦塔(DAG上dp)
紫书P269 看完紫书,终于可以自己写一个dp了 :)
【题目链接】巴比伦塔
【题目类型】DAG上dp
&题意:
有n种立方体 n<=30,每种有无穷个,要求选一些立方体摞成一根尽量高的柱子,上面的立方体长和宽必须严格小于下面的。
&题解:
看紫书前,我的想法:
这题就把所有的3种情况排个序啊,根据长和宽排,之后累计加高,就好了。
看紫书后,我的想法:
这是一个二元关系,而且没有环,又范围很小,所以用邻接矩阵建图,也就转化成DAG上的最长路径了。
差距:
之前的想法太幼稚,没有考虑到这样的情况:2 9 10之后是3 5 100 如果按照我之前的想法,那么我一定会用了长2 宽9 高10这个立方体,之后显然 高为100这个就用不到了,这明显不是最优的。
如果这块想通了,那么之后的想法也就没问题了:所以我们现在要做的是时时刻刻更新最大值,所以就是递归dp。
这题让我知道了,对于你并不知道这一步应该选择什么的时候,而且还没有规律,那么你也许就可以用dp,因为dp可以随时更新出你想要的东西。
【时间复杂度】O(n^2)
&代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
#define cle(a,val) memset(a,(val),sizeof(a))
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d %d",&(N),&(M))
#define SIII(N,M,K) scanf("%d %d %d",&(N),&(M),&(K))
#define rep(i,b) for(int i=0;i<(b);i++)
#define rez(i,a,b) for(int i=(a);i<=(b);i++)
#define red(i,a,b) for(int i=(a);i>=(b);i--)
const ll LINF = 0x3f3f3f3f3f3f3f3f;
#define PU(x) puts(#x);
#define PI(A) cout<<(A)<<endl;
#define DG(x) cout<<#x<<"="<<(x)<<endl;
#define DGG(x,y) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<endl;
#define DGGG(x,y,z) cout<<#x<<"="<<(x)<<" "<<#y<<"="<<(y)<<" "<<#z<<"="<<(z)<<endl;
#define PIar(a,n) rep(i,n)cout<<a[i]<<" ";cout<<endl;
#define PIarr(a,n,m) rep(aa,n){rep(bb, m)cout<<a[aa][bb]<<" ";cout<<endl;}
const double EPS = 1e-9 ;
/* C o d i n g S p a c e */
const int MAXN = 100 + 5 ;
int t1, t2, t3, n, cnt, K;
struct node {int x, y, z;bool operator <(const node& A) const {return x == A.x ? y < A.y : x < A.x;}
} s[MAXN], te;
bool G[MAXN][MAXN];
set<node> sen;
void input() {te.x = t1, te.y = t2, te.z = t3;if (te.x > te.y) swap(te.x, te.y);sen.insert(te);te.x = t1, te.y = t3, te.z = t2;if (te.x > te.y) swap(te.x, te.y);sen.insert(te);te.x = t2, te.y = t3, te.z = t1;if (te.x > te.y) swap(te.x, te.y);sen.insert(te);
}
void buildG() {rep(i, cnt) {rep(j, cnt) {if (s[i].x < s[j].x && s[i].y < s[j].y) {G[i][j] = 1;}}}
}
ll d[MAXN];
ll dp(int i) {ll& ans = d[i];if (ans >= 0) return ans;//刚开始时他的高就只有他自己的高ans = s[i].z;rep(j, cnt) {if (G[i][j]) {//注意这里:是dp(j) + s[i].z 不是dp(j) + s[j].zans = max(ans, dp(j) + s[i].z);}}return ans;
}
void Solve() {while (~SI(n), n) {cle(G, 0);sen.clear();rep(i, n) {SIII(t1, t2, t3);input();}cnt = 0;for (auto i = sen.begin(); i != sen.end(); i++, cnt++) {s[cnt].x = (*i).x, s[cnt].y = (*i).y, s[cnt].z = (*i).z;}buildG();
// rep(i,cnt){
// DGGG(s[i].x,s[i].y,s[i].z);
// }
// PIarr(G,10,10)ll ans = 0;rep(i, cnt) {cle(d, -1);ll te = dp(i);ans = max(te, ans);}printf("Case %d: maximum height = %lld\n", ++K, ans);}
}
int main() {
#ifndef ONLINE_JUDGEfreopen("C:\\Users\\Zmy\\Desktop\\in.txt", "r", stdin);
// freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout);
#endif
//iostream::sync_with_stdio(false);
//cin.tie(0), cout.tie(0);
// int T;cin>>T;while(T--)Solve();return 0;
}
转载于:https://www.cnblogs.com/s1124yy/p/5947440.html
uva 437 巴比伦塔(DAG上dp)相关推荐
- 刘书dp学习笔记(1) 数字三角形与DAG上dp(上)
我之前没怎么看过刘书,然后前几天看了一下dp,感觉dp观被刷新了- 终于明白为什么说刘书是神书了! 用[]括住的是在下的一些浅见与笔记. 顺便一提,在下不保证代码是能过评测的,因为只试了其中几个数据. ...
- UVa 1025 (DAG 上的动态规划,有固定终点的最短时间,逆推法)
题目链接 题意: 某城市的地铁是线性的,有n(2≤n≤50)个车站,从左到右的编号为1~N.有M1辆列车从第一站开始往右开,还有M2辆列车从第n站开始往左开.在时刻0,Mario从第1站出发,目的是 ...
- 20170814(三道题-DAG上DP 二分查找 map)
题目 NYOJ_16 矩形嵌套 题意 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a 解决 DAG上的动态规划 1. 二元关系能够用图来建立 ...
- UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)
整理的算法模板合集: ACM模板 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形. 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b) ...
- EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这 ...
- UVA116 单向TSP Unidirectional TSP(多阶段决策问题、输出字典序最小的方案、DAG上DP)
整理的算法模板合集: ACM模板 题目传送门 简单的多阶段决策问题. 多段图DAG,其节点可以划分为若干个阶段,每一个阶段只由上一个阶段所决定. 因为本题要求输出从前到后的方案,所以我们转移方程的时候 ...
- UVA1025 城市里的间谍 A Spy in the Metro(2003 ICPC world final)(DAG上DP)
整理的算法模板合集: ACM模板 输入比较麻烦 因为时间是单向流逝的,所以是一个天然的"序",我们可以用一维用来循环枚举时间,我们规定 f[i][j]表示当前时刻为i,你的位置为车 ...
- nyoj 16 矩形嵌套 (DAG上的DP)
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...
- nyoj 10 skiing(DAG上的最长路,备忘录方法)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...
- 嵌套矩形——DAG上的动态规划
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 题目描述: 有n个矩形,每个矩形可以用 ...
最新文章
- 刚入行的小菜鸡,怎样做好功能测试?
- wincc历史数据库_什么是数据库?如何学习数据库?
- MySQL的user表
- mybatis使用if判断参数是否为空
- matlab根据转移函数绘制放大器幅频响应和相频响应
- 实现一个简单的前端水印
- jquery-ajax的同步与异步
- 跨域问题解决(我只是搬运工)
- GTK+图形化应用程序开发学习笔记(五)—组装盒、组合表、固定容器构件
- 这些反病毒斗争经验,我全放这了!
- 数据结构—二叉树,满二叉树、完全二叉树、二叉树的性质(思维导图)
- 插槽样式_小程序,自定义组件之间的引用,使用插槽扩展组件
- ssis oracle配置,从SSIS包SQL Server连接Oracle数据库
- 深度残差网络+自适应参数化ReLU激活函数:调参记录17
- MAVEN 引入jar包没问题,但是程序中使用jar中的类报错的坑
- android朋友圈九宫格图片尺寸,朋友圈图片尺寸多少厘米(附朋友圈发图技巧)...
- 基于Gin+Vue+ElementUI实现的OA办公系统
- java之hashTab
- 心流体验:专注的快乐--读书笔记
- HR提升丨怎样当一名称职的中层管理者
热门文章
- window.open() 被拦截的问题解决
- 手机遥控器,3.5mm耳机接口红外遥控改造解析
- Sorted Adjacent Differences
- 树莓派--【vim配置】
- 网页另存为html有的图片无法显示,网页图片不能另存为怎么回事?网页上找到的图片不能另存的解决方法...
- 解密灰鸽子木马帝国【实在是恐怖呀】
- android system.img userdata.img文件解包打包及设置
- 触摸屏 触摸操作 鼠标点击事件
- 揭秘:全球第一张云安全国际认证金牌得主
- kibana报表展示