动态规划

先考虑斐波拉契数列:

对fib(6)递归树如下:

递归实现:

那么会多次调用函数求解common的子问题,比如fib(3), fib(2)。我们可以记录下来,用空间换时间:

但是此时的空间复杂度上升为O(n)了,可否节省呢?我们可以自底向上来求解,先求子问题,再来求父问题:

此时的空间复杂度就是O(1)了。

观察上述可以发现:

1. 如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。此性质决定了问题是否适合应用动态规划来求解。

2. 如果递归算法反复求解相同的子问题,就称为具有重叠子问题(overlapping subproblems)性质。此性质决定了动态规划比递归调用更节省时间。

你可能感兴趣的:(动态规划)