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

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

 

 

 
  

转载于:https://www.cnblogs.com/ALINGMAOMAO/p/9450468.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值