(dp)hihocoder - 1239 Fibonacci

原题链接: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\n", 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 }

 

转载于:https://www.cnblogs.com/tak-fate/p/6165466.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值