题目链接:https://codeforces.com/contest/1239/problem/A
题意:有n行m列的黑白格子,要求每个格子相邻最多只有一个和它颜色相同的格子,问有多少种可能。
做法:递推。首先我们发现,当两个相邻格子颜色相同时,它们所在的行(or列)就确定了,同时所有格子也就确定了。当没有两个相邻格子颜色相同时,只有两种情况。当只有一行(or 一列)格子的时候,每个格子的颜色由它前面两个格子决定,可以得出只有一行(or 一列)格子时候的递推式:F[n]=F[n-1]+F[n-2],就是斐波那契数列,因为有两种颜色,所以递推式是斐波那契数列*2,结合前面两个相邻格子颜色相同能确定所有格子,我们得到F[n]+F[m],但是我们对当没有两个相邻格子颜色相同时的情况重复计算了两次,所以得到结果F[n]+F[m]-2。
参考代码:
#include <iostream>
using namespace std;
const int MOD = 1000000007;
long long F[100005];
int main()
{
int n, m;
cin >> n >> m;
F[1] = 2, F[2] = 4;
for (int i = 3; i <= max(n, m); ++i)
F[i] = (F[i - 1] + F[i - 2]) % MOD;
cout << (F[n] + F[m] - 2) % MOD << endl;
return 0;
}
Codeforces #594 div 1 A/div 2 C - Ivan the Fool and the Probability Theory
原文:https://www.cnblogs.com/mapleaves/p/11808438.html