Recursion 递归可以是动态规划吗?
我被要求使用动态规划来解决一个问题。关于什么是动态规划,我有不同的看法。我认为这需要一种“自下而上”的方法,即首先解决最小的问题 有一件事我有矛盾的信息,那就是如果同一个子问题被多次解决,是否可以是动态规划,就像递归中经常出现的情况一样 比如说。对于斐波那契,我可以有一个递归算法:Recursion 递归可以是动态规划吗?,recursion,dynamic-programming,fibonacci,Recursion,Dynamic Programming,Fibonacci,我被要求使用动态规划来解决一个问题。关于什么是动态规划,我有不同的看法。我认为这需要一种“自下而上”的方法,即首先解决最小的问题 有一件事我有矛盾的信息,那就是如果同一个子问题被多次解决,是否可以是动态规划,就像递归中经常出现的情况一样 比如说。对于斐波那契,我可以有一个递归算法: RecursiveFibonacci(n) if (n=1 or n=2) return 1 else return RecursiveFibonacci(n-1) + RecursiveFibona
RecursiveFibonacci(n)
if (n=1 or n=2)
return 1
else
return RecursiveFibonacci(n-1) + RecursiveFibonacci(n-2)
在这种情况下,相同的子问题可能会被反复解决。这是否表明它不是动态规划?也就是说,如果我想要动态规划,我是否必须避免解决子问题,例如使用长度为n的数组并存储每个子问题的解决方案(数组的第一个索引是1、1、2、3、5、8、13、21)
动态程序通常可以用递归公式简洁地描述 但是,如果你用简单的递归计算机程序来实现它们,这些程序往往效率低下,原因正是你提出的:重复同样的计算。斐波那契是一个重复计算的例子,尽管它不是一个动态程序 有两种方法可以避免重复
N(c) = 1 + min_{i = 1..n} N(c - v_i)
基本情况是N(0)=0和N(k)=inf,对于k我们认为一个问题的动态规划方法是可行的
在自上而下的方法中,我们将尝试编写一个递归解决方案或蛮力解决方案并记忆结果,以便在出现类似子问题时尝试使用该结果,因此它是蛮力+记忆化。我们可以通过一个简单的递归关系实现暴力方法。谢谢Gene。因此,为了澄清定义(这就是我真正想要的:o)),即使使用递归算法,同样的问题可能会一次又一次地被解决,这是低效的,它仍然算作动态规划吗,仅仅因为较大的问题首先被分解成较小的问题?@user2808302不。我从来没有见过这样的术语。动态程序或DP算法的基本假设是,子问题只需求解一次即可得到较大的问题解。当用递归公式描述它时,意味着记忆化或自底向上的表构造。
N(c) = 1 + min_{i = 1..n} N(c - v_i)