介绍
动态编程在计算机编程中是一种技术,能够有效解决拥有重复子问题的一类问题或者最佳子结构的问题。
例子
以斐波那契数列问题为例说明动态编程
如果序列是F(1) F(2) F(3)…F(50),遵循F(n) = F(n-1) + F(n-2)
F(50) = F(49) + F(48)
F(49) = F(48) + F(47)
F(48) = F(47) + F(46)
...
注意到拥有重复子问题,我们需要计算F(48)来计算F(50)和F(49)。动态编程可以解决的类似这样的问题。
工作原理
动态编程通过存储子问题的结果,以至当子问题的结果需要时,可以直接使用,而不需要重新计算。
存储子问题的值到数组中,节省重新计算的时间。
var m = map(0 → 0, 1 → 1)
function fib(n)
if key n is not in map m
m[n] = fib(n − 1) + fib(n − 2)
return m[n]
上面的动态编程是一种自上而下的动态编程。但是通过反转算法,从基数开始计算,使用自下而上的动态编程
function fib(n)
if n = 0
return 0
else
var prevFib = 0, currFib = 1
repeat n − 1 times
var newFib = prevFib + currFib