zoukankan      html  css  js  c++  java
  • 1031 骨牌覆盖 (斐波拉契数列)

    哎呀,以后还是这类题还是多联想。(特点:走的方式不同,但到达某一地点是由后一步的两种情况决定的。)

    在2*N的一个长方形方格中,用一个1*2的骨牌排满方格。
     
    问有多少种不同的排列方法。
     
    例如:2 * 3的方格,共有3种不同的排法。(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果)
    Input
    输入N(N <= 1000)
    Output
    输出数量 Mod 10^9 + 7
    Input示例
    3
    Output示例
    3

    我先把我的错误思路搞一下。
    就是将输入的个数先都变成偶数,
    然后,再除以二,那么将相当与这整个情况是由这两个所组成的,我们很快的想到了母函数啦,我用了一维的杨辉三角算和sum。
    公式如下如果是偶数sum,    奇数就是2*sum-1;就成了。aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa就是不对啊,反正我觉没毛病。如果有大佬知道错在哪里希望指正一下。代码如下:()错误
    #include<cstdio>
    #define MOD int(1e9)+7
    #define MAXN 1002
    #define ll long long
    ll dp[MAXN];
    int main()
    {
        int n;
        scanf("%d", &n);
        int k = (n % 2 == 1) ? ((n - 1) / 2) : (n / 2);
        dp[0] = 1;
        for (int i = 1; i <= k; ++i)
        {
            dp[i] = dp[0] = 1;
            for (int j = i - 1; j >= 1; --j)
                dp[j] = (dp[j]+dp[j - 1])%MOD;
        }
        ll sum = 0;
        for (int i = 0; i <= k; ++i)
            sum += dp[i];
        if (n % 2){ sum = 2 * sum - 1; }
        printf("%lld\n", sum);
    }

    但是,其实也可以这样做,假设n个,那么他的排列一定是加2前的情况和加1的情况,为什么呢?应因为1只有一种排法,2有两种,相当于不同的方式到达同一个地方一样。那么就很符合斐波拉契数列的

    代码如下:

    #include<cstdio>
    #define MOD int((1e9)+7)
    #define ll long long
    #define MAXN 1001
    ll num[MAXN];
    int main()
    {
        num[0] = 1; num[1] = 1;
        int n;
        scanf("%d", &n);
        for (int i = 2; i <= n; i++)
        {
            num[i] = (num[i - 1] + num[i - 2])%MOD;
        }
        printf("%lld\n", num[n]);
    }

    记得复习斐波拉契数列的性质

    
    
  • 相关阅读:
    【转】SVN与Git比较
    我遇到了Hibernate异常
    使用 Eclipse 远程调试 Java 应用程序
    linux显示桌面快捷键设置
    Ubuntu共享WiFi(AP)给Android方法
    用zd1211+Ubuntu 10.04实现的AP
    Ubuntu开机自动禁用无线网络
    戴尔大力宣传Ubuntu 对比与Windows的差异
    【SSH进阶之路】Spring的AOP逐层深入——采用注解完成AOP(七)
    【SSH进阶之路】Spring的AOP逐层深入——AOP的基本原理(六)
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9450468.html
Copyright © 2011-2022 走看看