动态规划的三种实现方式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

朴素算法与递推算法的效率
程序结构
1,初始化: F[0]=0;f[i]=max 2,松驰操作: flag:=有紧边 while flag=有紧边 do begin flag:=无紧边; 枚举i; 再枚举i的所有入边w(j,i); if f[j]+w(j,i)<f[i] then begin f[i]:=f[j]+w(j,i); flag:=有紧边; end; end;
存在紧边,一定没有正确的求出最短路树 不存在紧边,一定正确的求出最短路树
动态规划的朴素算法 松驰操作
理解:
– 松驰操作的结果是使f[i]减小到最小(无紧边).
实现:
– 初始化
F[0]=0,f[i]=max
– 只要存在紧边,则用紧边对节点进行松驰操作,直到 无紧边为止.
思考:
1. 是不是所有的动态规划都可以用这个方法实现? 2. 为什么我们看到的大部分动态规划程序没有采用这个 方法,而是使用递推来实现呢?
动态规划通用方程
F[i]:从初始状态0走到i的最优值(最短路) 递推式:F[i]=min{f[i']+dist[i',i} (i'是i的上一 步,dist[i',i]是i'到i的距离) 边界:F[0]=0 因此只要依次确定f[0],f[1],f[2]…就可以了
动态规划的实现方式
1:朴素算法(松驰操作) 2:记忆化搜索 3:递推
记忆化搜索示范程 序
石子合并
有n个数a1,a2…an构成一个环 每次可以合并相邻两个数,代价为两个数 的和 N-1次合并后只剩一个数 求最小代价 要求:分别用朴素算法,记忆化搜索,递 推完成
noip06第一题记忆 化搜索
noip06第一题递推 标程

动态规划的理论基础 最优性原理
最优性原理: 若最短路u v经过中间结点w, 则u w和w v的路径分别是u到w和w到v 的最短路.
w u v
百度文库
上一阶段 的状态 决策 下一阶段 的状态
最优性原理的应用:动态规划 设F(d)为A到D的最短路长度 要从A走到D,最后一步有以下三种方案 1:经过c1到d,由最优性原理,最短路=f(c1)+4 2:经过c2到d,由最优性原理,最短路=f(c2)+3 3:经过c3到d,由最优性原理,最短路=f(c3)+5
递推程序结构
1,初始化: F[0]=0;f[i]=max 2,松驰操作: 按一定的顺序依次枚举i; 按一定的顺序依次枚举i; 再枚举i的所有入边w(j,i); if f[j]+w(j,i)<f[i] then begin f[i]:=f[j]+w(j,i); flag:=有紧边; end;
时间复杂度:O(节点总数*入度) 该算法一个重要前提条件: 在枚举i的所有入边w(j,i)时, 必须保证f[j]最优值已确定! 该算法效率高的主要原因: 只枚举i的所有入边.
时间复杂度:O(x*节点总数*入度) (x待定)
记忆化搜索
递推的效率很高 但有时阶段不容易找,或不容易递推 怎么办 记忆化搜索 Var f:array[0..n]of integer;//保存状态i的最优 值 F[i]先初始化为极小值(<0) function dfs(i)//求f[i] Var j:integer;//枚举变量j只能是局部变量 Begin if f[i]>0 then exit(f[i]); for 枚举i的所有入边j 如果从0->j->i的代价比f[i]更优,更新f[i] exit(f[i]); End;
松驰操作要点
动态规划与最短路
– 动态规划=求初始状态0到所有节点的最短路长度
松驰操作:
– F[i]:从初始状态0到状态i的最优值 – 紧边:使从0到i更优的边.(使f[i]更优) – 设0到i有一根绳,我们可以通过减小F[i]的值,从而使 这根绳变松. – If f[j]+w(j,i)<f[i] then f[i]:=f[j]+w(j,i) – 用紧边w(j,i)对状态i进行松驰操作使f[i]更优 – 结论
相关文档
最新文档