hiho一下 第113周 Fibonacci (dp)

原创 2016年08月29日 15:38:28

分析:

dp[i][j]表示前i个数,以第j个斐波那契数为结尾的前缀子序列有多少个。转移好想。
这里主要是在105范围以内,斐波那契数只有25个,可以加维度dp。

 #include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;
#define pr(x) cout << #x << ": " << x << "  " 
#define pl(x) cout << #x << ": " << x << endl;
typedef long long ll;

struct jibancanyang
{
    int rnk[112345], n, A[1123456];
    ll dp[1123456][26], mod = int(1e9) + 7;


    void pre() {
        memset(rnk, 0, sizeof(rnk));
        int a = 1, b = 1, cnt = 1;
        while (b <= 100000) {
            rnk[b] = cnt++;
            int t = a;
            a = b;
            b = t + b;
        }
    }

    void fun() {
        pre();
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i) scanf("%d", &A[i]);
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= n; ++i) {
            int r = rnk[A[i]];
            for (int j = 0; j <= 25; ++j) {
                dp[i][j] = dp[i - 1][j];
                if (j == r) {
                    if (r != 1)
                        dp[i][j] += dp[i - 1][j - 1];
                    else {
                        dp[i][0]++;
                        dp[i][j] += dp[i - 1][0];
                    }
                }
                dp[i][j] %= mod;
            }
        }
        ll ans = 0;
        for (int i = 0; i <= 25; ++i) {
            ans = (ans + dp[n][i]) % mod;
        }
        printf("%lld\n", ans);
    }

}ac;

int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif
    ac.fun();
    return 0;
}
版权声明:本文为博主原创文章,转载请注明作者:jibancanyang。

相关文章推荐

hiho一下 微软笔试题《String Matching Content Length》

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 We define the matching contents in the strings of strA ...

hiho一下#1050 : 树中的最长路

Link:http://hihocoder.com/problemset/problem/1050 时间限制:10000ms 单点时限:1000ms 内存限制:256MB ...

hiho一下 第四十八周——拓扑排序二

题目: 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒。这事在校内BBS上立刻引起了大...

hiho一下 第五周 Hihocoder #1037 : 数字三角形

#1037 : 数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖...

hiho一下 第九十一周 Events Arrangement

时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 There are n events in the parade. Each one can be...
  • ZzebraA
  • ZzebraA
  • 2016年04月05日 22:28
  • 160

hiho一下 第十六周 RMQ-ST算法

RMQ (Range Minimum/Maximum Query)问题:对于长度为N的数列a,若干次查询,每次给出R和L,a[L——R]的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。 此...
  • ZzebraA
  • ZzebraA
  • 2016年04月08日 21:02
  • 175

hiho一下 连通性二·边的双连通分量

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在基本的网络搭建完成后,学校为了方便管理还需要对所有的服务器进行编组,网络所的老师找到...

hiho一下 第140周-清理海报(DAG+dfs)

题目链接官方题解 题解里面貌似有错 这里应该还有条3->4的边有人会问为什么会有2->4这条边,从图上看2的四个点都被覆盖了。 这就是建图时要注意的地方了,建图时我们只要根据两个矩形是否相交...

hiho一下 第九十二周 数论一·Miller-Rabin质数测试

用Miller-Rabin算法测试素数 用了两种实现方式 参考Wikipedia #include typedef long long LL; //计算a*b(mod n) LL Powe...
  • ZzebraA
  • ZzebraA
  • 2016年04月08日 13:18
  • 244

hiho一下~week58 Beautiful String

题目意思: http://hihocoder.com/contest/hiho58/problem/1 给定一个有序的小写字母字符串,判断这个字符串中有没有 符合要求的子串 要求出现至少出现三个连...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hiho一下 第113周 Fibonacci (dp)
举报原因:
原因补充:

(最多只允许输入30个字)