地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=252

总结:与斐波那契差不多,动态规划主要玩的就是递归。

 1 //与斐波那契差不多,动态规划主要玩的就是递归
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 int main()
 5 { 
 6     int n,m,i,a[42];
 7     scanf("%d",&n);
 8     a[2]=3;a[3]=5;
 9     for(i=4;i<42;i++)
10     a[i]=a[i-1]+a[i-2];//利用 斐波那契公式 这里用数组,不用递归,是由于时间复杂度
11     while(n--)
12     {
13         scanf("%d",&m);
14         printf("%d\n",a[m]);
15     }
16     system("pause");
17     return 0;
18 }

 

 斐波那契:

方法1:使用递归解,时间复杂度是n的指数级别

但是这样的方法存在明显的不足,该方法的时间复杂度是n的指数级别,随着n的增大,运算时间不可想象,比如说f(50)就要很久。时间复杂度之所以这么大,是因此计算过程中存在着重复计算。以f(10)为例,f(10)=f(9)+f(8),f(9)=f(8)+f(7)。其中的f(8)就是重复计算的。

方法2:开辟一个长度为(n+1)的数组,时间复杂度为O(n),空间复杂度为O(n)

前面我们计算斐波那契数列是从后往前计算的,就是计算f(n)=f(n-1)+f(n-2),然后再递归计算f(n-1),又是从后往前计算,就是因为这样的从后往前计算,所以才会有很多的重复计算。那么我们可以逆转思路,考虑从前往后计算。比如我们要计算f(4),那么我们就计算f(0)、f(1)、f(2)、f(3),将这些计算出来的值保存在一个数组arry[n+1]上,这样计算斐波那契数列就相当于是一个填表的过程。时间复杂度大大降低。

 1 int Fibonacci(int n)
 2 {
 3     if(n<=0)
 4         return 0;
 5     else if(n==1)
 6         return 1;
 7     else
 8     {
 9         //动态创建一个长度为(n+1)的数组
10         int *arry=new int[n+1];
11         arry[0]=0;
12         arry[1]=1;
13         for(int i=2;i<=n;i++)
14         {
15             arry[i]=arry[i-1]+arry[i-2];
16         }
17         int result=arry[n];
18         //因为动态创建的数组不会因为出了作用域,内存就会被释放。
19         //动态分配的数组将一直存在,直到程序显示释放它为止,因此这里使用delete []
20         //c++提供delete []表达式释放指针所指向的数组空间。
21         delete [] arry;
22         return result;
23     }
24 }

 

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-10-11
  • 2021-12-03
  • 2021-12-12
  • 2022-12-23
  • 2022-12-23
  • 2021-07-24
猜你喜欢
  • 2021-07-06
  • 2021-08-29
  • 2021-11-23
  • 2022-12-23
  • 2021-06-01
  • 2022-12-23
相关资源
相似解决方案