51nod 1031 骨牌覆盖

本文探讨了2*N骨牌排列问题,通过递推思想找到问题的规律,将其转化为著名的斐波那契数列,并提供了一段C++代码实现。通过对不同规模的N进行分析,展示了解决此类问题的有效方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路:这是一道递推题,对于这类题,最好的方法是将N从1开始对每种情况在草稿纸上画一画,会找到规律。

对于本道题的规律是:对于2*N的骨牌排列总数分为两种情况,一种是在2*(N-2)的情况下添加两个横放的骨牌,另一种是在2*(N-1)的情况下添加一个一个骨牌即可。综上所述,2*N的情况总数为2*(N-2)情况下的总数+2*(N-1)情况的总数。

如果设2*N的排列总数为f[N],那么f[N]=f[N-2]+f[N-1],观察这个式子,不难发现这就是著名的斐波那契数列。

源码附上:

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
int f[1001];

int main()
{
	int N;
	cin>>N;
	f[1]=1;f[2]=2;
	for(int i=3;i<=N;i++)
	{
		f[i]=f[i-2]+f[i-1];
	}
	f[N]=f[N]%1000000007;
	cout<<f[N]<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值