哎呀,以后还是这类题还是多联想。(特点:走的方式不同,但到达某一地点是由后一步的两种情况决定的。)
在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]); }
记得复习斐波拉契数列的性质