原题目:
该题目的标签就写着要使用递推的方式,用组合数的方法写了很久没写出来,看了大神的解释才终于明白了。
主要思路:
由于要涂的颜色一共就有3种,所以当N≤3时,是特殊情况,需要单独考虑。
当N=1时,有3种选择;当N=2时,有6种选择;当N=3时,有6种选择。
当N≥4时,考虑任意长度的序列N,分以下两种情况:
- 第N-1个与第1个颜色相同时,那么第N个有两种选择,此时情况数其实是N-2时情况数再乘以2(因为第N-1个已经唯一确定了)。
- 第N-1个与第1个颜色不同时,那么第N个只有一种选择,此时情况数为N-1时的情况数。
综上,递推表达式可以表示为:f(N)=f(N-1)+2*f(N-2)
源代码:
#include <iostream>
using namespace std;
int main()
{
int N;
unsigned long long int cal[55];
cal[1] = 3;
cal[2] = 6;
cal[3] = 6;
for(int i = 4; i <= 54; i++)
{
cal[i] = cal[i-1] + cal[i-2]*2;
}
while(scanf("%d",&N) != EOF)
{
printf("%llu\n",cal[N]);
}
return 0;
}