DAG上的动态规划:

有向无环图上的动态规划是学习DP的基础,很多问题都可以转化为DAG上的最长路、最短路或路径计数问题。

1.没有明确固定起点重点的DAG模型:

嵌套矩形问题:有n个矩形,每个矩形可以用两个整数a、b表示它的长和宽,矩形可以嵌套在矩形中当且仅当a<c,b<d或者b<c,a<d。选出尽量多的矩形排成一行,使得除了最后一个之外,每个矩形都可以嵌套在下一个矩形内。如果有多解矩形编号字典序应尽量小。

  1. /**
  2. * 嵌套矩形问题:有n个矩形,每个矩形可以用两个整数a、b表示它的长和宽,
  3. * 矩形可以嵌套在矩形中当且仅当a<c,b<d或者b<c,a<d。选出尽量多的矩形排成一行,使得除了最后一个之外,每个矩形都可以嵌套在下一个矩形内。如果有多解矩形编号字典序应尽量小。
  4. */
  5. static int[] d= {-1,-1,-1,-1,-1,-1};
  6. static int[][]a=new int[6][6];
  7.  
  8. public static void getA(ErYuan[] es) {//建立单向无环图
  9. for(int i=0;i<es.length;i++) {
  10. for(int j=0;j<es.length;j++) {
  11. if(es[i].isOk(es[j])) {
  12. a[i][j]=1;
  13. }
  14. }
  15. }
  16. }
  17.  
  18. public static int dp(int i) {//从i开始的最大嵌套矩形个数
  19. if(d[i]>=0) {
  20. return d[i];
  21. }
  22. d[i]=0;
  23. for(int j=0;j<d.length;j++) {
  24. if(a[i][j]==1) {
  25. d[i]=Math.max(d[i],1+dp(j));
  26. }
  27. }
  28. return d[i];
  29. }
  30.  
  31. public static void test(int i,String head) {//找到d[i]中的最大值,按字典序输出路径们
  32. head=head+i;
  33. if(d[i]==0)
  34. {
  35. System.out.println(head);
  36. }
  37. String str="";
  38. for(int j=0;j<d.length;j++) {
  39. if(a[i][j]==1&&d[i]==d[j]+1) {
  40. test(j,head);
  41. }
  42. }
  43. }
  44. public static void main(String[] args) {
  45. Scanner scn=new Scanner(System.in);
  46. ErYuan[] es=new ErYuan[6];
  47. for(int i=0;i<6;i++) {
  48. int x=scn.nextInt();
  49. int y=scn.nextInt();
  50. es[i]=new ErYuan(x,y);
  51. }
  52. getA(es);
  53. for(int i=0;i<d.length;i++) {
  54. dp(i);
  55. }
  56. int max=0;
  57. for(int i=1;i<d.length;i++) {
  58. max=d[max]>=d[i]?max:i;
  59. }
  60. for(int i=max;i<d.length;i++) {
  61. if(d[i]==d[max]) {
  62. test(i,"");
  63. }
  64. }
  65. }
  1. class ErYuan{
  2. int x;
  3. int y;
  4. public boolean isOk(ErYuan e) {
  5. if((x<e.x&&y<e.y)||(e.x>y&&e.y>x)){
  6. return true;
  7. }
  8. return false;
  9.  
  10. }
  11. public ErYuan(int x, int y) {
  12. super();
  13. this.x = x;
  14. this.y = y;
  15. }
  16.  
  17. }

 2.固定终点的最长路和最短路

硬币问题:有n种硬币,面值分别为v1..vn,每种都有无限多,给定非负整数S。可以选用多少个硬币,使得面值之和恰好为S?输出硬币的最小值和最大值1<=n<100,0<=S<=10000,1<=vi<=S

  1. static int[]d=new int[10];
  2. static int[]vis=new int[10];
  3. static int[]v=new int[5];
  4. /**
  5. * 硬币问题:有n种硬币,面值分别为v1..vn,每种都有无限多,给定非负整数S。
  6. * 可以选用多少个硬币,使得面值之和恰好为S?
  7. */
  8. /**
  9. * S->0的路径长度
  10. * @param S
  11. */
  12. public static int dp(int S) {
  13. if(vis[S]==1)return d[S];
  14. vis[S]=1;
  15. for(int i=0;i<vis.length;i++)if(vis[i]<=S)d[S]=Math.max(d[S], dp(S-vis[i])+1);
  16. return d[S];
  17. }

如果要打印出来就同上,可以用递推或者储存的方式打印出来,储存的话用空间换取时间。

3.小结

传统的递推法可以表示成“对于每个状态i,计算f(i)",或者称为“填表法”.这需要对于每个状态i,找到f(i)依赖的所有状态。

刷表法:对于每个状态i,更新f(i)所影响的状态。只有当每个状态所依赖的对它的影响相互独立时才能用刷表法。

第九章(二)DAG上的动态规划的更多相关文章

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

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

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

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

  3. DAG上的动态规划之嵌套矩形

    题意描述:有n个矩形,每个矩形可以用两个整数a.b描述,表示它的长和宽, 矩形(a,b)可以嵌套在矩形(c,d)当且仅当a<c且b<d, 要求选出尽量多的矩形排成一排,使得除了最后一个外, ...

  4. 9.2 DAG上的动态规划

    在有向无环图上的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路,最短路或路径计数问题 9.2.1 DAG模型 嵌套矩形问题: 矩形之间的可嵌套关系是一种典型的二元关系,二元关系可以 ...

  5. DAG 上的动态规划(训练指南—大白书)

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

  6. DP入门(2)——DAG上的动态规划

    有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.DAG模型 [嵌套矩形问题] 问题 ...

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

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

  8. DAG上的动态规划---嵌套矩形(模板题)

    一.DAG的介绍 Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己. 摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都 ...

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

    题目大意是根据所给的有无限多个的n种立方体,求其所堆砌成的塔最大高度. 方法1,建图求解,可以把问题转化成求DAG上的最长路问题 #include <cstdio> #include &l ...

随机推荐

  1. 远程登录redis

    没想到吧,我居然已经摸到了redis. 远程登录redis redis-cli -h 127.0.0.1 -p 6379 ip地址和端口记得换成自己的

  2. Python算法题:金字塔

    代码如下: #Python金字塔练习 """ 最大层数:max_level 当前层数:current_level 金字塔正序时: 每层的空格=最大层数-当前层数 每层的星 ...

  3. 今天探究的CSS属性是box-sizing;

    首先BOX-SIZING属性是CSS3的属性: 语法: box-sizing : content-box || border-box || inherit 取值说明 1.content-box:此值为 ...

  4. 数据挖掘入门系列教程(十)之k-means算法

    简介 这一次我们来讲一下比较轻松简单的数据挖掘的算法--K-Means算法.K-Means算法是一种无监督的聚类算法.什么叫无监督呢?就是对于训练集的数据,在训练的过程中,并没有告诉训练算法某一个数据 ...

  5. Unity 游戏框架搭建 2019 (三十二、三十三) 类的命名 & 代码文件命名

    昨天我们完成了第八个示例的第二个 MenuItem 菜单顺序的调整. 我们今天再往下接着调整. 我们来看下接下来的 MenuItem 代码如下: [MenuItem("QFramework/ ...

  6. pytorch 中word embedding 词向量的使用

  7. node 搭载本地代理,处理web本地开发跨域问题

    var path = require('path') var httpProxy = require('http-proxy') var express = require('express') va ...

  8. 大部分人都不知道的8个python神操作

    01 print 打印带有颜色的信息 大家知道 Python 中的信息打印函数 Print,一般我们会使用它打印一些东西,作为一个简单调试. 但是你知道么,这个 Print 打印出来的字体颜色是可以设 ...

  9. How to permit SSH root Login in Ubuntu 18.04

    https://www.ubuntu18.com/ssh-permitrootlogin/ SSH root login is disabled by default in Ubuntu 18.04. ...

  10. ReportEventA 错误 ERROR_CRC

    如果 level 的宏弄错了,就会出现这种奇怪的现象.