zoukankan      html  css  js  c++  java
  • (dp)hihocoder

    原题链接:http://hihocoder.com/problemset/problem/1239


    题意:给一个数列,求构成斐波那契数列的子序列有几个。


    分析:我们可以在统计的过程中动态加出结果。

    由于有两个1,我们需要进行一些区分,我们首先定义m[0]表示以第一个1为结尾的斐波那契数列的个数,m[1]表示以第二个1为结尾的斐波那契数列的个数,同理,m[i](i>1,i表示斐波那契数的编号)表示以Fibonacci(i)为结尾的斐波那契数列的个数。

    比如这个例子1 1 2 1 2 3 4 5 。

    ①假设一开始1,这时m[0]=1。

    ②接着又一个1,这时由于m[0]=1之前已经有一个以第一个1为结尾的数列,所以m[1]+=m[0],又由于1单独自身能成为一个数列,所以m[0]+=1。

    ③接下来是2,我们需要看他前面那个斐波那契数,也就是第二个1,所以m[2]+=m[1]。

    ④然后是又是1,跟②一样,先加上已经有的,然后加上自己新的。m[1]+=m[0],m[0]+=1。

    ⑤依然是2,跟③一样,m[2]+=m[1]。

    ⑥然后是3,跟③⑤类似,m[3]+=m[2]。

    ⑦这次是4,发现不是斐波那契数,直接跳过。

    ⑧最后是5,依然类似,m[4]+=m[3]。


    代码:

     1 #include <set>
     2 #include <map>
     3 #include <list>
     4 #include <cmath>
     5 #include <queue>
     6 #include <vector>
     7 #include <bitset>
     8 #include <string>
     9 #include <cctype>
    10 #include <cstdio>
    11 #include <cstring>
    12 #include <cstdlib>
    13 #include <iostream>
    14 #include <algorithm>
    15 
    16 using namespace std;
    17 
    18 typedef long long ll;
    19 typedef unsigned long long ull;
    20 #define inf (0x3f3f3f3f)
    21 #define lnf (0x3f3f3f3f3f3f3f3f)
    22 #define eps (1e-8)
    23 int sgn(double a) {return a < -eps ? -1 : a < eps ? 0 : 1;}
    24 
    25 //--------------------------
    26 
    27 
    28 const ll mod = 1000000007;
    29 
    30 int fb[30] = {1, 1, 2};
    31 ll tb[30];
    32 map<int, int> m;
    33 int p;
    34 int n;
    35 
    36 void init() {
    37     m[1] = 1;
    38     m[2] = 2;
    39     for (p = 3;; p++) {
    40         if (fb[p - 1] + fb[p - 2] > 100000)break;
    41         fb[p] = fb[p - 1] + fb[p - 2];
    42         m[fb[p]] = p;
    43 
    44     }
    45 }
    46 
    47 
    48 
    49 void solve() {
    50     init();
    51     while (~scanf("%d", &n)) {
    52         memset(tb, 0, sizeof(tb));
    53         ll ans = 0;
    54         int x;
    55         int k = 0;
    56         for (int i = 0; i < n; i++) {
    57             scanf("%d", &x);
    58 
    59             int *lo = lower_bound(fb, fb + p, x);
    60             if (*lo != x) continue;
    61             if (x == 1) {
    62                 ans = (ans % mod + tb[0] % mod) % mod;
    63                 tb[1] = (tb[1] % mod + tb[0] % mod) % mod;
    64                 tb[0] = (tb[0] % mod + 1) % mod;
    65                 ans = (ans % mod + 1) % mod;
    66             } else {
    67                 tb[m[x]] = (tb[m[x]] % mod + tb[m[x] - 1] % mod) % mod;
    68                 ans = (ans % mod + tb[m[x] - 1] % mod) % mod;
    69             }
    70         }
    71 
    72         printf("%lld
    ", ans );
    73     }
    74 
    75 }
    76 
    77 int main() {
    78 
    79 #ifndef ONLINE_JUDGE
    80     freopen("1.in", "r", stdin);
    81     //freopen("1.out", "w", stdout);
    82 #endif
    83     //iostream::sync_with_stdio(false);
    84     solve();
    85     return 0;
    86 }
  • 相关阅读:
    Linux 详细命令操作大全二
    Liunx 环境安装配置Jupyter
    Linux 详细命令操作大全一
    Mysql int(10)和int(11)区别
    Python 面向对象编程
    Oracle数据库工具设置时间显示格式
    vue安装时报错:npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
    Oracle对当前时间的处理
    Oracle合并不同条件下统计出的总数
    记录一下vue-cli3搭建项目后遇到axios请求跨域的问题
  • 原文地址:https://www.cnblogs.com/tak-fate/p/6165466.html
Copyright © 2011-2022 走看看