杭电 2047 阿牛的EOF牛肉串
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=2047
题目描述:
有一个有字符E、O、F组成,长度为n的字符串,字符可重复,但是不能出现字符O与O相邻的情况,
给定字符长度n,问符合要求的字符串总共有多少种?
解题思路:
设长度为n符合要求的字符串种数为f(n),这其中可分为两类:一类是以E或者F结尾的,另一类是以O结尾的。以E或者F结尾、长度为n、符合要求的字符串来源于以三种字符中的任何字符结尾长度为n-1符合要求的字符串后加一个字符E或者F,这样第一类的种数就是 f(n-1)*2;而以字符O结尾、长度为n、符合要求的字符串来源于以E或者F结尾、长度为n-1、符合要求的字符串后直接加一个字符O,而以E或者F结尾、长度为n-1、符合要求的字符串来源于以三种字符中的任何字符结尾、长度为n-2、符合要求的字符串后直接加一个字符E或者F,这一类的种数就是2*f(n-2),
综上所述,f(n) = 2 * ( f(n-1) + f(n-2) );
c语言代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #define MAXN 45 int main() { int n, i; __int64 f[MAXN]; f[1] = 3; f[2] = 8; for( i = 3; i < 40; i++ ) f[i] = 2 * (f[i-1] + f[i-2]); /*for( i = 30; i < 40; i++ ) printf( "%I64d\n", f[i] );*/ while( scanf( "%d", &n ) != EOF ) { printf( "%I64d\n",f[n] ); } return 0; }