美文网首页Tech
hihocoder1239分析

hihocoder1239分析

作者: Lance_Van | 来源:发表于2016-04-02 23:01 被阅读41次

一、题意分析

给定一个n个数的数列,求其中的前缀斐波那契子串的个数对1000000007取模的值。例如:对于数列a{a1~a6}:
2 1 1 2 2 3

{a2}: 1
{a3}: 1
{a2, a3}: 1 1
{a2, a3, a4}: 1 1 2
{a2, a3, a5}: 1 1 2
{a2, a3, a4, a6}: 1 1 2 3
{a2, a3, a5, a6}: 1 1 2 3
有7个前缀斐波那契子串,解为7。

n<=1000000, 0<=ai<=100000

二、算法分析:

第一反应是动态规划。但是看到n的范围达到了106,感觉有点怕MLE。后来看到了ai的范围是105。而fibonacci数列第25项为75025,10^6*25的int数组还是可以开下的。

所以就定义转移方程如下:

f(i, j)表示当前在从ai取到an,当前正在取的是fibonacci数列的第j位。f(0, 0)即为所求。

当a[i] = fibonacci[j],也就是当前的ai正好是fibonacci数列的第j位的时候,我们有两个选择,取当前的ai:
这个操作用转移方程表示就是f(i+1, j+1)
或者不取,就是f(i+1, j)
那么f(i, j)就等于两种取法相加的和,f(i, j) = f(i+1, j+1) + f(i+1, j)

如果当前的值不能取,也就是a[i] != fibonacci[j],那么只有不取的情况,f(i, j) = f(i+1, j)。为了防止在加法过程中存爆,此处相加后应mod 1000000007。

接下来就是边缘判定:也就是j>=25以及i>=n的情况。由于都已经取完无法再取,那么这种情况下的f(i, j)的值就是1。
需要特别注意的是f(n, 0)应当等于0。按照它的含义,取到第n项(因为数组下标从0开始,所以第n项已经超出了),当前取的还是第0位,也就是第0位还没取!所以这个不应当成为一个解,f(n, 0)=0!

三、程序框架

先读入,data清-1,data[n][0]取0,然后DP求解f(0, 0)即可。

#include <stdio.h>

const int fibonacci[25] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025};
int a[1000000];
unsigned int data[1000001][26];
int n;

void trydp(int i, int j)
{
    if ((i >= n) || (j >= 25))
    {
        data[i][j] = 1;
        return;
    }
    if (data[i + 1][j] == -1)
        trydp(i + 1, j);
    data[i][j] = data[i + 1][j];
    if (a[i] == fibonacci[j])
    {
        if (data[i + 1][j + 1] == -1)
            trydp(i + 1, j + 1);
        data[i][j] = (data[i][j] + data[i + 1][j + 1]) % 1000000007;
    }
}

int main()
{
    scanf("%d", &n);
    int i, j;
    for (i=0; i<n; ++i)
        scanf("%d", &a[i]);

    long ans = 0;
    for (i=0; i<=n; ++i)
        for (j=0; j<=26; ++j)
            data[i][j] = -1;
    data[n][0] = 0;

    trydp(0, 0);
    printf("%d\n", data[0][0]);

    return 0;
}

相关文章

  • hihocoder1239分析

    一、题意分析 给定一个n个数的数列,求其中的前缀斐波那契子串的个数对1000000007取模的值。例如:对于数列a...

  • 常用数据分析方法

    对比分析(现状分析) 趋势分析(预测分析) 矩阵关联分析 分组分析(原因分析-分布情况) 漏斗...

  • 零售业大数据分析

    零售业数据分析包括: 财务分析销售分析商品分析顾客分析供应商分析人员分析 1 财务分析 1)分析企业的财务状况,了...

  • 分析分析分析

    新工作第三天,沒有前兩天覺得那麼難熬。也不是難熬,不過是有些覺得無所事事。今天用SQL導出了工作的數據,然後下午學...

  • 用数据驱动产品和运营 之 数据分析方法

    数据分析方法 多维事件分析 漏斗分析 留存分析 行为序列分析 A/B测试 用户分群 (一)数据分析——多维事件分析...

  • 9种常用的数据分析方法

    公式拆解、对比分析、A/Btest、象限分析、帕累托分析、漏斗分析、路径分析、留存分析、聚类分析 一、公式拆解 所...

  • 数据分析

    数据分析基本方法 对比分析(横向对比纵向对比) 趋势分析 象限分析 交叉分析 数据分析框架_AARRR分析 逻辑分...

  • OpenCV-Python学习(十):图像滤波之傅里叶变换

    滤波分析又分为 时域分析、频域分析: 时域分析: 直接对信号本身进行分析。 频域分析: 对信号的变化快慢进行分析。...

  • 7张脑图讲透如何做好品牌、价格、渠道、市场、机会分析

    1、品牌分析: 2、价格分析 3、广告分析 4、渠道分析: 5、市场机会分析: 6、满意度分析 7、市场细分分析 ...

  • 谁说菜鸟不懂数据分析-读书整理

    数据分析简述: 数据分析分类及作用: 分类:描述性分析,探索性分析,验证性分析 作用:现状分析,原因分析,...

网友评论

    本文标题:hihocoder1239分析

    本文链接:https://www.haomeiwen.com/subject/xjfulttx.html