【算法】详解动态规划,及动态规划与递归的区别

1、什么是动态规划
是运筹学的一个分支,是一种分阶段解决策略问题的最优解的数学思想。

2、动态规划与分治
相同点:通过求解子问题,然后再组合达到解决原问题的目的。
不同点:分治是把原问题分解成互不相交的子问题,然后再递归求解。
动态规划是把原问题分解成子问题,但子问题中有公共的子问题,在计算子问题的过程中把结果记录下来,然后再遇到相同的子问题时可以不用再计算,以此提高计算速度。

3、假如有10级楼梯,问有多少上楼梯的方案。
f(n)=f(n-1)+f(n-2)
1、递归解决:由于子问题中有公共的子问题,所以递归的层数会比较多,速度慢且浪费空间。
2、递归+备忘录:由于在递归过程子问题计算很多次,可以把子问题的计算结果记录下来,不需要重复计算。
3、递推解决:先解决小问题,然后合并后推导出大问题。
4、背包问题
金砖
价值:500 200 350 300 400 w
消耗:5 3 4 3 5 v
现有资源:p=100
f(p) = max(f(n-1,p),f(n-1,p-v[n])+w[n])
保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

4、动态规划与递归思想的区别:

    (1. 分治法与动态规划主要共同点:
二者都要求原问题具有最优子结构性质,都是将原问题分而治之,分解成若干个规模较小(小到很容易解决的程序)的子问题.然后将子问题的解合并,形成原问题的解.
   (2. 分治法与动态规划实现方法:
          ① 分治法通常利用递归求解.
          ② 动态规划通常利用迭代法自底向上求解,但也能用具有记忆功能的递归法自顶向下求解.
   (3. 分治法与动态规划主要区别:
          ① 分治法将分解后的子问题看成相互独立的.
          ② 动态规划将分解后的子问题理解为相互间有联系,有重叠部分.

猜你喜欢

转载自blog.csdn.net/weixin_48994377/article/details/108506857