动态规划详解

Posted 前端末班车

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划详解相关的知识,希望对你有一定的参考价值。

什么是动态规划问题?

为了求出f(n),只需要知道几个更小的f(c)。我们将求解f(c)称作求解f(n)的“子问题”


动态规划的核心?

记住求解过的子问题的解


动态规划的特性

1. 重叠子问题

2. 最优子结构性质:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解。


解决动规问题的套路?

过程:递归的暴力解法 -> 带备忘录的递归解法 -> 非递归的动态规划解法


状态转移方程怎么得出?

参考思路:明确「状态」 -> 定义 dp 数组/函数的含义 -> 明确「选择」-> 明确 base case


问题一:斐波那契数列

最基本的递归算法相信大家都可以背出来了,但很快就会发现其存在了大量的重复计算(重叠子问题);优化版本通常是通过创建一个数组用于记录计算过的f(n),即带备忘录的递归;但此时仍然是自顶而下的,一般来说由于备忘录方式的动态规划方法使用了递归,递归的时候会产生额外的开销;而使用自底向上的动态规划解法要比备忘录方法更进一步,然后也就有了状态转移方程。


斐波那契数列的问题,何通过「备忘录」或者「dp table」的方法来优化递归树,区别只是自顶向下和自底向上的不同而已。


问题二:凑零钱

简述:有 k 种面值的硬币,面值分别为 c1, c2 … ck,每种硬币的数量无限。为了凑出总金额 amount 最少需要几枚硬币,若不能则返回 -1。

比如 amount=11, coins={1,2,5}。用暴力递归的方式可以尝试自顶向下画一个三叉树,然后找到满足 amount 的最小路径也就是最少的硬币数。此时差不多就可以写出递归算法了,进而优化递归树,消除重叠子问题。详细过程还是看原文吧……



长按阅读原文


如有侵权,请联系删除

以上是关于动态规划详解的主要内容,如果未能解决你的问题,请参考以下文章

DP问题详解 | 动态规划的思考角度

动态规划详解

动态规划详解_2

动态规划详解(修订版)

(转)dp动态规划分类详解

柳小葱的力扣之路——动态规划详解