当年学习算法的时候 也没认真去实践dynamic programming. 今日一试,被震慑了. 不废话, 上代码, 比performance.
为了防止桟溢出, 试了个fib 50
结果 naive 跑了40s, 而dynamic的只用0.2s.
分析:
Wiki上讲dynamic programming applicable的条件有两:
(1) optimal substructure
(2) overlapping subproblems (Fib就是个完美的例子涅)
naive算法:
Fib(n) : 被call 1次
Fib(n-1): 2
Fib(n-2): 3
....
Fib(2): Fib(n-1)
Fib(1): Fib(n)
So 总共递归调用了 Fib(1)+Fib(2)+...+Fib(n)次Fib 方法
而dynamic的却是linear的... 强大!