【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划

因为种种缘由(看这一章间隔的时间太长,弄不清动态规划、分治、递归是什么关系),致使这章内容看了三遍才基本看懂动态规划是什么。动态规划适合解决可分阶段的组合优化问题,但它又不一样于贪心算法,动态规划所解决的问题的各个阶段是相互关联的,一个阶段的选择会影响其它阶段的选择。动态规划有两个优势:一是能够排除一些解,另外一个是能够帮助咱们系统化的解决问题,使问题变得清晰。算法

下面就说一下我对动态规划、分治、递归这三者的理解。分治算法是将原问题分解成两个较小的问题,而动态规划是将问题分红不一样的阶段(步骤),固然,正如上面所说的,咱们要注意加以区别动态规划和贪心算法所解决问题的类型。使我(们)把动态规划和分治混在一块儿的就是它们都有递归函数,那么递归和它们是什么关系呢?个人理解是动态规划和分治算法是一种抽象的算法,而递归是一种具体的实现手段。说了这么多,下面就举两个例子来讲明动态规划方法具体是怎样实现的。编程


求两点之间的最短路径问题。请你们稍微观察一下下图:编程语言

 

咱们注意到,从S到F的最短路径必定通过A、B、C中的一点和D、E中的一点,所以,咱们能够将该问题分红多个阶段,第一阶段是求D、E分别到F的最短距离,第二阶段是求A、B、C通过D、E中的一点到F的最短距离,第三阶段是求S通过A、B、C中的一点到F的最短距离,具体步骤以下:函数

  • 第一阶段:(D,F)=2,(E,F)=3(其中(D,E)表示D到F的最短距离,其它类推)
  • 第二阶段:(A,F)=min{(A,D)+(D,F),(A,E)+(E,F)}=min{3+2,4+3}=5
            (B,F)=min{(B,D)+(D,F),(B,E)+(E,F)}=min{2+2,5+3}=5 
            (C,F)=min{(C,E)+(E,F)}=min{1+3}=4
  • 第三阶段:(S,F)=min{(S,A)+(A,F),(S,B)+(B,F),(S,C)+(C,F)}=min{1+5,3+4,6+4}=6

因此从S到F的最短路径距离是6,经过上面的步骤能很容易获得从S到F的最短路径为S->A->D->F。从这个例子中,也许咱们不能很好地体会动态规划是怎样运用递归的,那咱们就从下面的例子中简单说明递归在动态规划中的做用。学习

最长公共子序列问题。在这就不介绍什么是最长公共子序列问题了。运用动态规划的思想,咱们依然考虑将问题分红多个阶段,并从后往前想。咱们应该能想到最长公共子序列问题最后一个阶段是判断两个字符串的最后一个字符是否相同。优化

  • 若相同,则最长公共子序列必定包含这个字符,咱们只需判断 的最长公共子序列便可。
  • 若不一样,最长公共子序列必定是在 中。

用表达式表达以下:spa


算法设计与分析这门课就学到这了,抛去用编程语言具体实现,总体来讲仍是很好理解的。接下来我将对计算机的其余课程进行复习,但愿本身能坚持学习,在学习的过程当中能有当初上课时不同的收获。设计

相关文章
相关标签/搜索