题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2047

解题思路:

我们假设n个格子时又f(n)种方案。当前考虑第n个点,如果第n个点时非O那么就只能时E或者F。那么f(n)和f(n-1)的关系是f(n) = 2f(n-1),因为按照排列组合规律,前n-1个点已经确定时,第n个有几种方案就是总方案数乘几。

如果第n个点是O,那么n-1 一定不是O,只能是E或者F。这样前n-2个就受限制,如果前n-2个确定以后,前n-2,和n-1,n三部分组成的方案数是f(n) = 2f(n-2)

两种情况合起来就是f(n) = 2f(n-1) + 2f(n-2)

code:

#include <cstdio>

using namespace std;
typedef long long LL;

LL s[40+7];
int main()
{
    s[1] = 3;
    s[2] = 8;
    for(int i=3; i<41; i++)
    {
        s[i] = s[i-1] * 2 + s[i-2] * 2;
    }
    int n;
    while(scanf("%d", &n) != EOF)
    {
        printf("%lld\n", s[n]);
    }


    return 0;
}