C 动态规划的探讨

C 动态规划的探讨,c,dynamic-programming,C,Dynamic Programming,我已经写了一个小程序来计算一个数字的阶乘使用动态规划技术 #include<stdio.h> int fact(int n) { int f[n],i; f[0] = 1; for(i=1;i<=n;i++) f[i] = i * f[i-1]; return f[n]; } int main(void) { printf("\n Factorial of %d is %d ",5,fact(5)); ret

我已经写了一个小程序来计算一个数字的阶乘使用动态规划技术

#include<stdio.h>

int fact(int n)
{
    int f[n],i;
    f[0] = 1;

    for(i=1;i<=n;i++)
        f[i] = i * f[i-1];
    return f[n];
}

int main(void)
{
    printf("\n Factorial of %d is %d ",5,fact(5));
    return 0;
}
#包括
整数事实(整数n)
{
int f[n],i;
f[0]=1;

对于(i=1;i是的,这是动态编程:从基本情况到最终情况。当然,您的示例(阶乘)太简单了,所以您可以自己简化许多事情:您消除了递归,并且在记忆中从不使用测试。但无论如何,就是这样

有关回忆录的总体方案,请参见


有关动态规划的解释,请参见,您将能够阅读有关斐波那契序列及其使用自底向上方法计算的部分。

是的,您解决问题的方法是动态规划的一个非常简单的案例,您可以在其中存储以前解决的子问题,以帮助您解决实际问题问题。虽然您提供的示例被认为是动态规划,但它通常不被称为记忆化

当有人说“记忆化”时,通常涉及到自上而下的解决问题的方法,在这种方法中,您假设您已经通过以递归方式解决子问题的方式构建程序,从而解决了子问题。 您可以存储这些子问题的结果,或将这些子问题的结果存储起来,以避免重复计算

让我通过一个例子来说明记忆化

下面是计算数字的第n个斐波那契的简单示例:

int fib(int n)
{
   if (n <= 1)
      return n;
   return fib(n-1) + fib(n-2);
}
intfib(intn)
{

如果(n)你为什么不确定
?依我看,它肯定是一个编号。
fact()
应该是一个递归函数,根据需要。那么你能告诉我这里有什么问题吗
fact()
应该是一个。这里没有什么真正的错误。唯一的错误是数组的大小不正确,将它声明为
f[n+1]
@Jean BaptisteYunès为什么数组应该是n+1?所有dp算法都使用n+1数组。我不明白原因。如果我需要计算10^9的斐波那契,该怎么办。我认为这个解决方案不会像声明长度为10^9+1的数组那样有效。你会得到java.lang.OutOfMemoryError:java heap space.error。还有更好的方法吗?
/*Global array initialized to 0*/
int a[100];

int fib(int n)
{
    /*base case*/
    if (n <= 1) 
        return n;
    /*if fib(n) has not been computed, compute it*/
    if (a[n] == 0) {
        a[n] = fib(n - 1) + fib(n - 2);
    }
    */Otherwise, simply get a[n] and return it*/
    return a[n];
}  
 int fib(int n)
 {
   /* just like the array you declared in your solution */
   int f[n+1];
   int i;

   /* set up the base cases, just like how you set f[0] to 1*/
  f[0] = 0;
  f[1] = 1;

   for (i = 2; i <= n; i++)
   {
       /* using previously solved problem to solve further problems*/
       f[i] = f[i-1] + f[i-2];
   }
     /*return the final result*/
   return f[n];
}