巴比伦塔

紫书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)相关推荐

  1. 刘书dp学习笔记(1) 数字三角形与DAG上dp(上)

    我之前没怎么看过刘书,然后前几天看了一下dp,感觉dp观被刷新了- 终于明白为什么说刘书是神书了! 用[]括住的是在下的一些浅见与笔记. 顺便一提,在下不保证代码是能过评测的,因为只试了其中几个数据. ...

  2. UVa 1025 (DAG 上的动态规划,有固定终点的最短时间,逆推法)

    题目链接 题意:  某城市的地铁是线性的,有n(2≤n≤50)个车站,从左到右的编号为1~N.有M1辆列车从第一站开始往右开,还有M2辆列车从第n站开始往左开.在时刻0,Mario从第1站出发,目的是 ...

  3. 20170814(三道题-DAG上DP 二分查找 map)

    题目 NYOJ_16 矩形嵌套 题意 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a 解决 DAG上的动态规划 1. 二元关系能够用图来建立 ...

  4. UVA437 巴比伦塔 The Tower of Babylon(矩形嵌套进阶版、DAG上DP、记忆化搜索)

    整理的算法模板合集: ACM模板 本题和基础的矩形覆盖差不多,只不过变成了三维的长方形. 因为每次转移的时候只有顶面的x和y会影响决策的进行,所以我们只需要用一个二元组(a,b)(a, b)(a,b) ...

  5. EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)

    题意: 一张由 n 个点,m 条边构成的有向无环图.每个点有点权 Ai.QQ 小方想知道所有起点为 1 ,终点为 n 的路径中最大的中位数是多少. 一条路径的中位数指的是:一条路径有 n 个点,将这  ...

  6. UVA116 单向TSP Unidirectional TSP(多阶段决策问题、输出字典序最小的方案、DAG上DP)

    整理的算法模板合集: ACM模板 题目传送门 简单的多阶段决策问题. 多段图DAG,其节点可以划分为若干个阶段,每一个阶段只由上一个阶段所决定. 因为本题要求输出从前到后的方案,所以我们转移方程的时候 ...

  7. UVA1025 城市里的间谍 A Spy in the Metro(2003 ICPC world final)(DAG上DP)

    整理的算法模板合集: ACM模板 输入比较麻烦 因为时间是单向流逝的,所以是一个天然的"序",我们可以用一维用来循环枚举时间,我们规定 f[i][j]表示当前时刻为i,你的位置为车 ...

  8. nyoj 16 矩形嵌套 (DAG上的DP)

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a< ...

  9. nyoj 10 skiing(DAG上的最长路,备忘录方法)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑 ...

  10. 嵌套矩形——DAG上的动态规划

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 题目描述: 有n个矩形,每个矩形可以用 ...

最新文章

  1. 刚入行的小菜鸡,怎样做好功能测试?
  2. wincc历史数据库_什么是数据库?如何学习数据库?
  3. MySQL的user表
  4. mybatis使用if判断参数是否为空
  5. matlab根据转移函数绘制放大器幅频响应和相频响应
  6. 实现一个简单的前端水印
  7. jquery-ajax的同步与异步
  8. 跨域问题解决(我只是搬运工)
  9. GTK+图形化应用程序开发学习笔记(五)—组装盒、组合表、固定容器构件
  10. 这些反病毒斗争经验,我全放这了!
  11. 数据结构—二叉树,满二叉树、完全二叉树、二叉树的性质(思维导图)
  12. 插槽样式_小程序,自定义组件之间的引用,使用插槽扩展组件
  13. ssis oracle配置,从SSIS包SQL Server连接Oracle数据库
  14. 深度残差网络+自适应参数化ReLU激活函数:调参记录17
  15. MAVEN 引入jar包没问题,但是程序中使用jar中的类报错的坑
  16. android朋友圈九宫格图片尺寸,朋友圈图片尺寸多少厘米(附朋友圈发图技巧)...
  17. 基于Gin+Vue+ElementUI实现的OA办公系统
  18. java之hashTab
  19. 心流体验:专注的快乐--读书笔记
  20. HR提升丨怎样当一名称职的中层管理者

热门文章

  1. window.open() 被拦截的问题解决
  2. 手机遥控器,3.5mm耳机接口红外遥控改造解析
  3. Sorted Adjacent Differences
  4. 树莓派--【vim配置】
  5. 网页另存为html有的图片无法显示,网页图片不能另存为怎么回事?网页上找到的图片不能另存的解决方法...
  6. 解密灰鸽子木马帝国【实在是恐怖呀】
  7. android system.img userdata.img文件解包打包及设置
  8. 触摸屏 触摸操作 鼠标点击事件
  9. 揭秘:全球第一张云安全国际认证金牌得主
  10. kibana报表展示