我正在阅读动态编程,我对它很陌生。我想知道动态编程是否可以以“迭代”和“递归”方式应用,或者仅将其中一种方式应用于它是一种好习惯。任何好的例子/链接都会有所帮助。
答案 0 :(得分:7)
是的,DP可以应用于两者。
从这里开始:http://en.wikipedia.org/wiki/Dynamic_programming
然后你有Dynamic Programming: From novice to advanced和A Tutorial on Dynamic Programming
对于第一个教程,您将找到TopCoder.com练习问题的链接(每个问题都有Editorial解释解决方案背后的想法。
答案 1 :(得分:7)
动态编程(在许多情况下)可以看作是反向实现的递归解决方案。
通常,在递归中,您可以使用x(n+1) = f(x(n))
(或其他某些值)的某些停止条件计算n=0
。
在许多情况下,函数f
是一些最小/最大函数,但它不一定是。
此外,该函数不必采用单个变量。
动态编程可以通过计算f(0)
,然后计算f(1)
,然后计算f(2)
等来解决此问题。
如果有多个变量,通常会有一些自然顺序来计算函数。
动态编程可以解决的一个例子: 您将获得3个高尔夫球杆。每个高尔夫球杆可以向前发送高尔夫球x个单位(例如,24,37和54个单位)。问题是:你能打到距离正好200个单位的洞吗?如果可以的话,你需要的最小射击次数是多少。
递归解决方案类似于:
shots(200) = min(shots(200-24),shots(200-37),shots(200-54))
这将允许一个简单的实现,其中函数shot(n)
如果n为0则返回0,如果n小于0则返回一些大数字,否则返回上面的表达式。
但是,对于较大的n值,您将从上面表达式的不同分支中反复尝试相同的值。在这种情况下,最好从0开始计算shots(0)
,shots(1)
,shots(2)
等。这将是解决此问题的“动态编程”解决方案 - 使用线性时间和常量空间而不是指数时间(遍历3向树)和线性空间(对于调用堆栈)。