Codeforces #594 div1 A/div2 C - Ivan the Fool and the Probability Theory

题目链接: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;
}
posted @ 2019-11-06 20:32  mapleaves  阅读(111)  评论(0)    收藏  举报