我被要求使用动态编程来解决问题。我对动态编程的构成有不同的看法。我相信它需要一种“自下而上”的方法,首先解决最小的问题。
我有一个矛盾的信息,如果相同的子问题被多次解决,是否可以是动态编程,递归中经常出现这种情况。
例如。对于斐波那契,我可以有一个递归算法:
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)?
Fibonacci(n)
F1 = 1
F2 = 1
for i=3 to n
Fi=Fi-1 + Fi-2
return Fn