算法与数据结构---6.2、斐波那契数列-滚动数组优化
一、总结
一句话总结:
a、因为递推表达式f[i]=f[i-1]+f[i-2]中只用到了f[i]、f[i-1]和f[i-2]三个元素,所以可以用含有三个元素的数组来优化
b、滚动数组的代码修改也很简单,直接在递推表达式有i的位置%3即可,f[i%3]=f[(i-1)%3]+f[(i-2)%3]
#include <iostream> using namespace std; const int mod=1000000007; int f[3]; int main(){ int n; cin>>n; //1、确定初始值 f[1]=f[2]=1; //2、循环做递推,3-n for(int i=3;i<=n;i++){ //F(n)=F(n-1)+F(n-2) f[i%3]=(f[(i-1)%3]+f[(i-2)%3])%mod; } //注意n也需要模3 cout<<f[n%3]<<endl; return 0; }
二、斐波那契数列
博客对应课程的视频位置:6.2、斐波那契数列-滚动数组优化
https://www.fanrenyi.com/video/27/274
1、题目描述
问题描述:
满足F1=F2=1,F(n)=F(n-1)+F(n-2)的数列称为斐波那契数列(Fibonacci),
它的前若干项是1,1,2,3,5,8,13,21,34,55...,求此数列第n项 mod 10^9+7的值(n>=3)。
输入格式:
一行一个正整数n
输出格式:
一行一个整数表示答案。
输入输出样例:
输入5,输出5
输入10,输出55
【数据范围】
对于60%的数据,1<=n<=92;
对于100%的数据,1<=n<2^63。
题目位置:
P1962 斐波那契数列 - 洛谷 | 计算机科学教育新生态
https://www.luogu.com.cn/problem/P1962
2、递推解法
1 /*
2
3 递推关系式:
4 题目中已经非常明显的给出了,就是
5 F(n)=F(n-1)+F(n-2)
6
7 解决递推问题的一般步骤
8 1、建立递推关系式:F(n)=F(n-1)+F(n-2)
9 2、确定边界条件:
10 f(1)=f(2)=1,
11 所以我们的循环可以从3开始,到n结束,
12 也就是3-n
13
14 算法步骤:
15 1、确定初始值
16 2、循环做递推,3-n
17
18 */
19 #include <iostream>
20 using namespace std;
21 const int mod=1000000007;
22 int f[200000];
23 int main(){
24 int n;
25 cin>>n;
26 //1、确定初始值
27 f[1]=f[2]=1;
28 //2、循环做递推,3-n
29 for(int i=3;i<=n;i++){
30 //F(n)=F(n-1)+F(n-2)
31 f[i]=(f[i-1]+f[i-2])%mod;
32 }
33 cout<<f[n]<<endl;
34 return 0;
35 }
3、滚动数组优化
1 /* 2 3 之前的最大子段和的动态规划的优化的时候, 4 我们讲了滚动数组优化, 5 原因是 对应的状态转移方程为: 6 f[i]=max(f[i-1]+a[i],a[i]) (2<=i<=n) 7 里面只用到了f[i]和f[i-1]这两个元素, 8 所以可以用只有两个元素的数组来优化 9 10 我们现在的递推表达式是: 11 f[i]=f[i-1]+f[i-2] (3<=i<=n) 12 里面用到了f[i]、f[i-1]和f[i-2]三个元素, 13 所以可以用含有三个元素的数组来优化 14 15 滚动数组的代码修改也很简单 16 直接在递推表达式有i的位置%3即可 17 f[i%3]=f[(i-1)%3]+f[(i-2)%3]; 18 (%3是因为现在是有三个元素的滚动数组) 19 20 注意: 21 取结果的时候,n也需要模3,例如f[n%3] 22 23 */ 24 25 #include <iostream> 26 using namespace std; 27 const int mod=1000000007; 28 int f[3]; 29 int main(){ 30 int n; 31 cin>>n; 32 //1、确定初始值 33 f[1]=f[2]=1; 34 //2、循环做递推,3-n 35 for(int i=3;i<=n;i++){ 36 //F(n)=F(n-1)+F(n-2) 37 f[i%3]=(f[(i-1)%3]+f[(i-2)%3])%mod; 38 } 39 //注意n也需要模3 40 cout<<f[n%3]<<endl; 41 return 0; 42 }