目录
动态规划简介:
动态规划算法的基本思想是:将带求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解中得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,避免重复求解。该思想与记忆化搜索类似,即将计算步骤中的过程保存下来,避免重复运算
具有什么特征的问题可以用动态规划求解:
-
该问题应该能够分成较小的重叠子问题。
-
通过使用较小子问题的最佳解决方案可以实现最佳解决方案。
-
动态算法使用Memoization。
和其他同类算法相比动态规划有什么样的特点:
- 与解决局部优化的贪婪算法相反,动态算法被激励用于问题的整体优化。
- 与分而治之的算法相比,其中解决方案被组合以实现整体解决方案,动态算法使用较小子问题的输出,然后尝试优化更大的子问题。动态算法使用Memoization来记住已经解决的子问题的输出。
-
对于递归,只要写好了退出条件,之后不停的调用自身即可,最终到达退出条件时,逐个退出函数。动态规划则是从头开始,用循环达到目的。动态规划和递归的最大的区别,就是在碰到重叠子问题(Overlap Sub-problem)时,是否只需要计算一次。
动态规划常用来解决的问题类型:
- 斐波纳契数系列
- 背包问题
- 河内塔
- 由Floyd-Warshall完成的所有最短路径
- Dijkstra的最短路径
- 项目安排
参考链接:
原理及案例介绍:https://wenku.baidu.com/view/fc387897fbd6195f312b3169a45177232e60e408.html
原理介绍及C代码:https://www.cnblogs.com/kika/p/10851492.html
原理介绍及Python代码:https://blog.youkuaiyun.com/weixin_40787712/article/details/89702437