动态规划的定义
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法–动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
概念的意义
动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。
虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。
动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。
入门看的哦
动态规划的思想
-
把原始问题划分为一系列子问题
-
.求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时到时直接存取,不重复计算,节省计算时间
-
自底向上地计算
优化子结构的分类
编号动态规划:输入为x1,x2,…,xnx1,x2,…,xn,子问题是x1,x2,…,xix1,x2,…,xi,子问题复杂性为O(n)O(n)(最大不下降子序列问题)
划分动态规划:输入为x1,x2,…,xnx1,x2,…,xn,子问题为xi,xi+1,…,xjxi,xi+1,…,xj,子问题复杂性是O(n2)O(n2)(矩阵链乘问题)
数轴动态规划:输入为x1,x2,…,xnx1,x2,…,xn和数字C,子问题为x1,x2,…,xix1,x2,…,xi,K(K≤C)K(K≤C),子问题复杂性O(nC)O(nC)(0-1背包问题)
前缀动态规划:输入为x1,x2,…,xnx1,x2,…,xn和y1,y2,…,ymy1,y2,…,ym,子问题为x1,x2,…,xix1,x2,…,xi和y1,y2,…,yjy1,y2,…,yj,子问题复杂性是O(mn)O(mn)(最长公共子序列问题)
树形动态规划:输入是树,其子问题为子树,子问题复杂性是子树的个数。(树中独立集合问题)
##引用的哦,特此声明,引用自牛岱那么如果我在计算出了从 5 到 10 的路径数,这个路径数是不是可以保存下来?
为什么要保存?因为这个信息一会儿还要再次被用到!
因为不管我是从3走过来的,还是从4走过来的,走到5之后,存在的路径就是第一次计算出的结果,你无需重复计算!
如果是暴力遍历的话,从 3 到 10 的时候, 你肯定会把 5 - 10 的可能路径数都算一遍,然后从 4 到 10 的时候,你又会把 5 - 10的路径算一遍,也就是重复计算了~
那么既然这样,我们创建一个数组a[],专门来存放位点 x 到 10 的所有可能路径数,初始值记为 0,然后每当要计算 x 到 10 的路径数时,先检测一下该路径数的值是不是大于 0 ,如果大于,就说明它之前已经被计算过,并存在了a[x]中了!
那么我们马上可以得到一个递推关系:
a[x] = a[x+1] + a[x+2];
那么举个例子:
a[6] = a[7] + a[8];
a[7] = a[8] + a[9];
我们发现, 在计算 a[6] 和 a[7] 的时候, 我们都用了a[8],也就是被重复利用了结果。