动态编程递归或迭代

时间:2011-09-04 00:54:52

标签: algorithm

我正在阅读动态编程,我对它很陌生。我想知道动态编程是否可以以“迭代”和“递归”方式应用,或者仅将其中一种方式应用于它是一种好习惯。任何好的例子/链接都会有所帮助。

2 个答案:

答案 0 :(得分:7)

是的,DP可以应用于两者。

从这里开始:http://en.wikipedia.org/wiki/Dynamic_programming

然后你有Dynamic Programming: From novice to advancedA 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向树)和线性空间(对于调用堆栈)。