动态规划算法的基本套路框架:
首先,动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如求最长递增子序列、最小编辑距离等。
既然是求最值,求解动态规划的核心问题是穷举。因为要求最值肯定要把所有可行的答案穷举出来,然后在其中找最值。记住,以后遇到求最值的问题首先思考如何穷举所有可能结果,这要练成条件反射。
动态规划这么简单,穷举就完事了?我看到的动态规划问题都很难啊!
首先,动态规划的穷举有点特别,因为这类问题存在“重叠子问题”,如果暴力穷举效率会极其低下,所以需要“备忘录”或者“DP table”来优化穷举过程,避免不必要的计算然后,动态规划问题一定会具备“最优子结构”,这样才能通过子问题的最值得到原问题的最值。
最后,虽然动态规划的核心思想就是穷举求最值,但是问题可以千变万化,穷举所有可行解其实并不是一件容易的事,只有列出正确的“状态转移方程”,才能正确地穷举以上提到的重叠子问题、最优子结构、状态转移方程就是动态规划三要素。三要素具体是什么意思下面会举例详解,但是在实际的算法问题中,写出状态转移方程是最困难的,这也就是为什么很多朋友觉得动态规划问题不好做的原因。一定要思考以下几点:
1这个问题的最简单情况是什么?
2这个问题有什么“状态”?
32第1章 核心套路篇
3对于每个“状态”,可以做出什么“选择”使得“状态”发生改变?
4如何定义dp数组/函数的含义来表现“状态”和“选择”?
说白了就是三点:状态、选择、dp 数组的定义。最后的代码可以套这个框架:
#初始化base c