DAG上的动态规划:

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

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

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

 /**
* 嵌套矩形问题:有n个矩形,每个矩形可以用两个整数a、b表示它的长和宽,
* 矩形可以嵌套在矩形中当且仅当a<c,b<d或者b<c,a<d。选出尽量多的矩形排成一行,使得除了最后一个之外,每个矩形都可以嵌套在下一个矩形内。如果有多解矩形编号字典序应尽量小。
*/
static int[] d= {-1,-1,-1,-1,-1,-1};
static int[][]a=new int[6][6]; public static void getA(ErYuan[] es) {//建立单向无环图
for(int i=0;i<es.length;i++) {
for(int j=0;j<es.length;j++) {
if(es[i].isOk(es[j])) {
a[i][j]=1;
}
}
}
} public static int dp(int i) {//从i开始的最大嵌套矩形个数
if(d[i]>=0) {
return d[i];
}
d[i]=0;
for(int j=0;j<d.length;j++) {
if(a[i][j]==1) {
d[i]=Math.max(d[i],1+dp(j));
}
}
return d[i];
} public static void test(int i,String head) {//找到d[i]中的最大值,按字典序输出路径们
head=head+i;
if(d[i]==0)
{
System.out.println(head);
}
String str="";
for(int j=0;j<d.length;j++) {
if(a[i][j]==1&&d[i]==d[j]+1) {
test(j,head);
}
}
}
public static void main(String[] args) {
Scanner scn=new Scanner(System.in);
ErYuan[] es=new ErYuan[6];
for(int i=0;i<6;i++) {
int x=scn.nextInt();
int y=scn.nextInt();
es[i]=new ErYuan(x,y);
}
getA(es);
for(int i=0;i<d.length;i++) {
dp(i);
}
int max=0;
for(int i=1;i<d.length;i++) {
max=d[max]>=d[i]?max:i;
}
for(int i=max;i<d.length;i++) {
if(d[i]==d[max]) {
test(i,"");
}
}
}
 class ErYuan{
int x;
int y;
public boolean isOk(ErYuan e) {
if((x<e.x&&y<e.y)||(e.x>y&&e.y>x)){
return true;
}
return false; }
public ErYuan(int x, int y) {
super();
this.x = x;
this.y = y;
} }

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

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

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

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

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. 【LeetCode】57. Insert Interval [Interval 系列]

    LeetCode中,有很多关于一组interval的问题.大体可分为两类: 1.查看是否有区间重叠: 2.合并重叠区间;  3.插入新的区间: 4. 基于interval的其他问题 [ 做题通用的关键 ...

  2. idea ------- 源码调试运行

    1.创建一个 想学 的 ,使用单步调试进行一步步学习 调整系统资源 单步调试 (F7) ,进入不了源码,调整idea 让我们可以进入底层学习 想要在源码里面添加注释,要将引用的源文件指向,我们刚才复制 ...

  3. 【mybatis xml】数据层框架应用--Mybatis 基于XML映射文件实现数据的CRUD

    使用MyBatis框架进行持久层开发 MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架. MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索. MyBa ...

  4. python 进阶篇 迭代器和生成器深入理解

    列表/元组/字典/集合都是容器.对于容器,可以很直观地想象成多个元素在一起的单元:而不同容器的区别,正是在于内部数据结构的实现方法. 所有的容器都是可迭代的(iterable).另外字符串也可以被迭代 ...

  5. Python数据预处理:使用Dask和Numba并行化加速

    如果你善于使用Pandas变换数据.创建特征以及清洗数据等,那么你就能够轻松地使用Dask和Numba并行加速你的工作.单纯从速度上比较,Dask完胜Python,而Numba打败Dask,那么Num ...

  6. Java中Character类

    Character 类在对象中包装一个基本类型char的值此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等),并将字符从大写转小写,反之亦然. 构造方法: Character(char ...

  7. ansible的语法的基础应用(二)

         

  8. webform 最后的黄昏之力

    前言 现在有人谈起webform 一般都会说这种技术已经过时了,毫无用处. 因为我们在日常开发中已经不会去开发哪种几个简单的网页的程序,我们的业务更加复杂,这种拖动式的过于死板. 但是是否毫无用处呢? ...

  9. Scala的自定义类型标记

    Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini-好像黑夜中的萤火虫,那么耀眼,那么出众. 好了言归正传,这一篇文章我们会讲一下S ...

  10. Linux / mac OS Shell常用命令

    一.文件.目录操作命令 1.ls命令 功能:显示文件和目录的信息 ls 以默认方式显示当前目录文件列表 ls -a 显示所有文件包括隐藏文件 ls -l 显示文件属性,包括大小,日期,符号连接,是否可 ...