Loading

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]);
}

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

 

 


posted @ 2018-08-09 17:36  青山新雨  阅读(321)  评论(0编辑  收藏  举报