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 (DAG 上的动态规划,有固定终点的最短时间,逆推法)

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

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

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

  3. P3244 [HNOI2015]落忆枫音(DAG上的动态规划问题,朱刘定理,乘法逆元)

    P3244 [HNOI2015]落忆枫音 样例太坑了!竟然和题目描述给的图不一样! 题目描述 给定一张有向无环图,这张图满足一个性质:以点1为根节点,保证至少有一棵有向树,连接所有的节点. 现在向这张 ...

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

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

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

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

  6. 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划 第一节 动 ...

  7. SRPG游戏开发(四十)第九章 战斗系统 - 二 计算战斗数据(Calculate Combat Data)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  8. 第九章 SQL查询数据库(二)

    文章目录 第九章 SQL查询数据库(二) 调用用户定义函数的查询 查询串行对象属性 查询集合 使用说明和限制 调用文本搜索的查询 伪字段 查询元数据 快速查询 查询和企业缓存协议Enterprise ...

  9. 达芬奇密码 第九十二章

    达芬奇密码 第九十二章[@more@] 第九十二章 国王学院是国王乔治四世于1829年创建的,里面设有神学及宗教研究所,它离议会很近,是由皇家出资运营的.国王学院的宗教部在宗教教学以及研究方面号称具有 ...

  10. 现实迷途 第九章 N夜情(上)

    第九章 N夜情(上) 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任. 江北对于夏欣,还没有上升到要追她的高度,他只是想玩玩而已.也许是因为受到女友绝情地离他而去的刺激,也许是因为受到狗 ...

最新文章

  1. 堡垒机高危命令正则表达式
  2. 阿里达摩院包揽AI领域六大权威榜单冠军:用人类的学习方式超越人类
  3. java基础知识之初识java
  4. 《系统集成项目管理工程师》必背100个知识点-21监控项目工作ITTO
  5. 计算机函数图象,信息技术应用用计算机绘制函数图象
  6. j2me手机游戏结构分析和实际小例子系列一 游戏背景和游戏精灵
  7. No module named 'urllib2'
  8. w3wp oracle,w3wp.exe占用CPU超过50%的处理
  9. Python入门教学之(标识符和保留字)
  10. 如何销毁一个实例化对象_JAVA中如何创建和销毁对象
  11. 来及Java空间的传送门2
  12. 在深圳呆那么就感觉伤心了有木有?
  13. 计算机科研立项应用类题目,省级课题计算机课题题目推荐
  14. stata-如何快速合并多个文件夹下的数据文件
  15. Unity开发OpenXR | (一)OpenXR是什么?一文带你全面了解OpenXR的相关知识,上车收藏不迷路
  16. [RK3399][Android7.1] Display中的VOP模块介绍
  17. UM5202EEDFSOT-143工作电压5V用于高速线路保护的2线ESD保护二极管阵列管UM5202EEDF USB端口和以太网端口保护TVS二极管阵列,低泄漏电流和箝位电压25V结电容1PF
  18. ytu 2463:给小鼠补充代码(DFS 深度优先搜索)
  19. 计算机专业的烧脑问题,这几类专业很“烧脑”,数学不好的同学慎报,不然就是噩梦的开始...
  20. 直播平台源码实现状态栏滑动隐藏和tabbar的教程

热门文章

  1. iOS自动布局高级用法 纯代码约束写法
  2. NOD32 V5 企业版部署方案
  3. 一个有趣的例子,JS+CSS实现【兴趣是最好的老师】
  4. ap_invoice_distributions_all与PO表关联问题
  5. P ⊆ co-NP的原因
  6. [转载]仿射变换(Affine Transformation)
  7. hdoj 1071 The Area 求面积
  8. python用pandas读取数据时出现错误_Python Pandas错误标记数据
  9. 拓端tecdat|R语言中的模拟过程和离散化:泊松过程和维纳过程
  10. figsize, dpi参数