1、动态规划
什么时候使用动态规划呢?
Those who cannot remember the past well are condemned to repeat it.
所以动态规划非常适合解决那些具有相同步骤的事(相同子步骤的问题)。
2、举个例子
从斐波那契数列开始:
1 1 2 3 5 8 13 21 34 ..........
上述斐波那契数列就非常符合动态的思想,第一,它有终止条件,也就是数列的第一项和第二项都是1;第二,它有完美的递推表达式,也就是说,从第三项开始,每一项的值等于它前两项的和,也就是F(n)=F(n-1)+F(n-2)。
3、深入分析
从上述斐波那契数列的递推表达式可知,当我们计算第6项的时候:
从上图可以看出,里面有些项我们在反复计算,有的项要计算很多次。这对计算机的内存和运行时间都是极大的浪费。因此我们采用动态规划记忆化递归的方式来解之。
4、记忆化递归
def fib(n): if(n<=0): return "error" Memo = [] Memo[0]=0 Memo[1]=1 for i in range(2,n+1): Memo.append(Memo[i-1]+Memo[i-2]) return Memo[n]
记忆化递归再求解的时候,我们会把之前的信息记录下来,这样当我们需要每一项的值的时候就不需要重新返回计算,从而大大减少计算量。