阿牛的EOF牛肉串
Time Limit: 1000ms Memory limit: 32768K 有疑问?点这里^_^
题目描述
今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" "O" "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。
你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?
你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?
输入
输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0< n< 40)。
输出
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
示例输入
1 2
示例输出
3
8
以前也有接触过递推的题,不过都没大注意过,今天做了一个发现一直一来对递推的理解竟然是完全错误的。。SAD (渣渣以为递推是这个样子的--f(n)=a*n 就是以为f(n)是关于n的一个具体函数,妈蛋数学学多了吧。。好吧 这次才发现原来递推是这样的 f(n)=a*f(n-1)+b*f(n-2)+......)
恩 以后多做递推的练习。。
说思路:题意很清楚,给定一个长度为n的字符串,用3种字符E O F 排列 OO不相邻 要求n等于一个具体数时排列数
考虑第n个位置是O还是非O 如果是O 第n-1个位置上只能是E或F 而对n-2位置上没要求 推得 fn1=2*f(n-2);
如果不是O 则n-1位置上没要求 fn2=2*f(n-1)
所以总的情况 fn=fn1+fn2=2(f(n-1)+f(n-2)) 当n=1时 fn=3; 由此递推
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
int n,i;
double f[40]={3,8};
for(i=2;i<40;i++)
f[i]=2*(f[i-1]+f[i-2]);
while(scanf("%d",&n)!=EOF)
{
printf("%.0lf\n",f[n-1]);
}
return 0;
}