zoukankan      html  css  js  c++  java
  • 算法与数据结构---6.2、斐波那契数列-滚动数组优化

    算法与数据结构---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 }

     
  • 相关阅读:
    内存泄漏 Memory Leaks 内存优化 MD
    Handler Thread 内部类引起内存泄露分析
    为什么不取消注册BroadcastReceiver会导致内存泄漏
    WebChromeClient 简介 API 案例
    WebViewClient 简介 API 案例
    java.net.URI 简介 文档 API
    android.net.Uri 简介 API
    RV 多样式 MultiType 聊天界面 消息类型 MD
    JS函数声明与定义,作用域,函数声明与表达式的区别
    CSS中table tr:nth-child(even)改变tr背景颜色: IE7,8无效
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13047564.html
Copyright © 2011-2022 走看看