先考虑斐波拉契数列:
对fib(6)递归树如下:
递归实现:
那么会多次调用函数求解common的子问题,比如fib(3), fib(2)。我们可以记录下来,用空间换时间:
但是此时的空间复杂度上升为O(n)了,可否节省呢?我们可以自底向上来求解,先求子问题,再来求父问题:
此时的空间复杂度就是O(1)了。
观察上述可以发现:
1. 如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。此性质决定了问题是否适合应用动态规划来求解。
2. 如果递归算法反复求解相同的子问题,就称为具有重叠子问题(overlapping subproblems)性质。此性质决定了动态规划比递归调用更节省时间。