计算机中的动态规划方法
由计算机来处理数学或现实中的问题,本质在于如何对问题进行数学建模,也就是怎样将问题中含有的要素与相应数据结构中的项形成对应关系,以及将对问题求解的过程转化为对数据的操作组合。
而在计算机中,对现实问题数学建模,常用的方法是递推或递归的分析思路。将一个大的问题分割成小的局部问题,通过获得最小问题的解、局部问题的过程解析以及分析由小问题的解向更大问题的解的过渡阶段,可构成一维或多维的离散递推公式,最后可通过函数的递归的方式进行计算机求解。
然而,这种函数式递归求解过程的计算复杂度很大,几乎不具有实用性。而导致其计算复杂度很大的原因是针对低阶项进行了大量重复计算。为了减少重复计算,可将小规模局部问题的解存储在内存中,等到计算大问题时直接用之。具体有如下两种方式:
1、通过记忆化递归方法
// 斐波那契数列生成 int F[n] = {0} fibonacci(n) if n== 0 || n==1 return F[n] = 1 //将1保存在F中 if F[n] 已经计算完成 return F[n] return F[n] = fibonacci(n-2) + fibonacci(n-1)
2、动态规划方法
// 斐波那契数列生成 Fibonacci(n) F(0) = 1 F(1) = 1 for i从2到n F[i] = F[i-2] + F[i-1]
总之,就是要寻找方法找到多维离散数据之间的递推公式(分析小问题及小问题如何变成更大一点的问题),然后再递归求解的过程中将局部问题的解保存在内存中,避免重复计算。