1.动态规划–套路框架
本文内容来自github:labuladong 的算法教程,学习完之后做的笔记,大家可以去github看一下写的非常好。
前言
动态规划的问题一般形式是求最值;核心问题是穷举;所以遇到求最值的问题就穷举。
但是在动态规划中,最终的穷举结果会存在重叠的问题,暴力穷举的话效率会非常的低,所以需要使用“备忘录”或者“DP table”,优化我们的穷举过程;其次动态规划中一定会有最优子结构,这样就可以通过子问题的最值找到原问题的最值;最后若想穷举,只有列出状态转移方程才可以。
所以动态规划三要素是:重叠子问题、最优子结构、状态转移方程;其中状态转移方程是最难的,在写转移方程的时候需要考虑下面几个问题:
- 这个问题的base case(最简单情况)是什么?
- 这个问题有什么“状态”?
- 对于每个状态可以做出什么选择使得状态发生改变?
- 如何定义dp数组/函数的含义来表现状态和选择?
# 初始化base case
dp[0][0][...] = base case
#进行状态转移
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for ...
dp[状态1][状态2][...] = 求最值(选择1,选择2,...)
下面通过斐波那契和凑零钱问题