Fibonacci前缀子串个数

该博客探讨了一道编程问题,涉及计算给定序列中包含的Fibonacci前缀子序列的数量。博主首先介绍了问题背景和限制条件,然后详细阐述了解决思路:构建Fibonacci数列并进行哈希,利用动态规划(dp)数组记录以每个Fibonacci数为结尾的子序列数量。在遍历输入序列时,对于Fibonacci数,答案加上其前一个Fibonacci数对应子序列数量,并更新当前dp值。
摘要由CSDN通过智能技术生成

题意:(http://hihocoder.com/problemset/problem/1239)给定一个序列,问该序列中蕴含的fibonacci前缀子序列有多少个。如长度为4的序列1122,答案为5,分别为1、1、11、112、112。题目保证输入中的每个数不大于100000.

思路:先构造不大于100000的fibonacci序列,并且将数字之于下标hash一下。dp[i]表示第i个fibonacci数为最后一个数的子序列个数。然后从左往右扫一遍输入串,如果该数不是fibonacci数,那么不管。如果是1,特判;如果是其他的fibonacci数,那么答案加上前一个fibonacci数为终止数的子序列个数(通过hash),并且更新当前的dp。如果解释的不清楚,见代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#define M 100000
#define N 1000000
int s[N],f[M],hash[M+5];
int t[M];
int n;
void init(){
    memset(t, 0, sizeof(t));
    memset(hash,0,sizeof(hash));
    f[0] = f[1] = 1;
    for(int i = 2;;i++){
        f[i] = f[i-1]+f[i-2];
        if(f[i] > M)
            break;
        hash[f[i]] = i;
    }
}
int main(){
    init();
    scanf("%d",&n);
    for(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值