通常,我们把动态规划简称为:DP(dynamic programming)

首先,动态规划在本质上是对搜索的一种优化。也就是对重叠子问题的优化。
比如斐波那契数列,如果我们既要计算f(99)、f(100)和f(101),我们就可以保存f(99)和f(100)的值,这样对于f(101)来说时间复杂度为O(1),否则时间复杂度为O(101),也就是时间复杂度优化到了约为原来的1/100。

重叠子问题:
重叠子问题就是前面的解可以用在后面一个解上,如上面说过的斐波那契数列。如果没有重叠子问题,则DP无法优化。因为DP的本质是把已经算出的结果存起来,也就是记忆化。并在下一步计算中直接使用上一步的结果,而不是重新算一遍。如果没有重叠子问题,也就是说没有重复计算的地方,那么我们存储结果也没有意义。因此,我们说:如果某个问题没有重叠子问题,那么使用DP无法有效优化。

记忆化:
记忆化的意思就是存储已经算出的结果。

最优子结构:
子问题的最优解可以用于问题的最优解。

无后效性:
如果我们解决了一次问题B(假设解决B使用了问题A的结论),那么我们就不需要再求问题A的结论,在问题B后面的问题直接使用问题B的结论即可。