题意
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
思路
典型的递推,一开始居然没想出来。。
设有n个方格的情况为
f(n)
,已经涂好了n-2个方格,这时要涂第n-1个格子,有两种情况:
1.颜色和第一个格子不同
2.颜色和第一个格子相同
第一种情况下,最后一个格子的颜色已经没得选了,所以这种情况下可能的情况数为
f(n−1)
.
第二种情况下,最后一个格子的颜色还有两种可选,所以情况数为
f(n−2)
.
综上
f(n)=f(n−1)+f(n−3)
,n > 3,
f(3)=6,f(2)=6,f(1)=3
代码
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
const int kMaxn = 50;
ll f[kMaxn + 5];
int main() {
int n;
f[1] = 3;
f[2] = 6;
f[3] = 6;
for(int i = 4; i <= kMaxn; i++)
f[i] = f[i - 1] + 2 * f[i - 2];
while(~scanf("%d", &n)) {
printf("%lld\n", f[n]);
}
return 0;
}