在大三上算法设计课程的时候,开始接触了动态规划,初学的时候没什么感觉,唯一的印象就是这种方法能逐步根据最优子结构得到最终的最优解。也就是保证每一个子问题的解决得到的都是最优解,那最终得到的答案肯定也是最优解。动态规划跟分而治之还是有点区别的,动态规划的子问题之间关系紧密,而分而治之问题的解决,其子问题之间可以没什么太大的关联性。这里俺们就来看看动态规划的方法以及运用。

    先看看历史:

    上世纪40年代,Richard Bellman最早使用动态规划这一概念表述通过遍历寻找最优决策解问题的求解过程。1953年,

Richard Bellman将动态规划赋予现代意义,该领域被IEEE纳入系统分析和工程中。为纪念Bellman的贡献,动态规划的核心

方程被命名为贝尔曼方程,该方程以递归形式重申了一个优化问题。

    要能使用动态规划算法,首先是能将问题划分成许多的小问题,然后必须能找出解决这些问题的最优结构,也就是最优子结构。

     一般,动态规划的执行步骤是:

    (1)找出最优解的性质,并刻划其结构特征。

      (2)递归地定义最优值。

      (3)以自底向上的方式计算出最优值。

      (4)根据计算最优值时得到的信息,构造最优解。

     利用动态规划算法可以用来解决一些经典的问题,比如矩阵连乘、最长公共子序列、背包问题、串编辑问题。还常常运用在生物信息学、语言处理等领域中。

      1、矩阵连乘问题及最长公共子序列问题

           在博客http://www.cnblogs.com/chinazhangjie/archive/2010/11/16/1878400.html中有详细的解决步骤。

     2、背包问题

          主要是0/1背包问题:http://blog.youkuaiyun.com/dapengbusi/article/details/7463968

     3、串编辑问题

          http://qinxuye.me/article/get-edit-distance-by-dynamic-programming/

     4、最优二叉查找树

         http://blog.youkuaiyun.com/qp120291570/article/details/8171661

     5、旅行商问题

         http://wiki.mbalib.com/wiki/%E6%97%85%E8%A1%8C%E5%95%86%E9%97%AE%E9%A2%98