杭电ACM 2047 - 阿牛的EOF牛肉串(解题思路与详细分析)

Hdu 2047 阿牛的EOF牛肉串

题目

Problem Description
今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" “O” "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。

你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗?

PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢!

再次感谢

Input
输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0<n<40)。

Output
对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。
Sample Input
1
2

Sample Output
3
8

解题思路

一、首先根据题意得知这是一道递推求解的题目,所以只需要找到题目的递推公式即可。
二、 其次题目中n的取值范围有明确的规定,而通常的递推求解题结果基本上都会超出int的数据范围。所以可以采用打表的方法和使用long long数据类型。
三、最后找到题目中的规律即可,即基本上就是f(n)f(n-1)的对应关系

分析

一、 对于这种递推求解的题目无非分为两种递推的方式:
(1)从前往后递推
(2)从后往前递推
这道题用从后往前递推的方式比较好,因为题目中的限制条件为禁止出现O相邻的情况。所以后一项判断前一项的取值比较容易。下面分析两种解题思路:
二、从后往前递推:
分为两种情况
① 当第n个是“O”时,依据限制条件,那么第n-1个不能为“O”,那n-1不为“O”就有两种情况了,即为“E”或者“F”,所以这种情况有f(n-2)*2
② 当第n个不为“O”时,与第一步相同,也有两种情况,即为“E”或者“F”,所以这种情况有f(n-1)*2个.
③ 将①②两种情况的个数加起来就得到了递推公式:f(n)=f(n-2) * 2+f(n-1) * 2
三、从前往后递推:
首先看图(图画的有点丑,见谅见谅~):
在这里插入图片描述
①据上图可知,当上一个字符不是“O”时,可以往后加“E”,“O”,“F”三个字符,当上一个字符不是“O”时, 可以往后加“E”,“F”两个字符。
②为便于递推,设置三个数组,a[n]代表此步时最后一个字符不为“O”的情况个数,b[n]代表此步时最后一个字符为“O”的情况个数,c[n]代表此步总情况个数。所以有c[n]=a[n]+b[n]
③ 当c[n-1]最后一个字符不为“O”,c[n-1]可以分化成三种情况,即在尾部加上“E”,“O”,“F”,
当c[n-1]最后一个字符为“O”,c[n-1]可以分化成三种情况,即在尾部加上“E”,“F”。举个例子:上一个为“EE”时,下一个可以分化成“EEE”,“EEO”,“EEF”;上一个为“EO”时,下一个可以分化成“EOE”,“EOF”。由此可得,a[n] = 2c[n-1];b[n]=a[n-1]
④综上递推的公式:
c[n]=a[n]+b[n]
a[n] = 2c[n-1]
b[n]=a[n-1]
可以推导出总的递推公式:c[n]=2*c[n-1]+2*c[n-2]

代码

#include <stdio.h>
int main(){
	int n,i;
	long long a[40]={3,8};
	for(i=2;i<40;i++){
		a[i] = 2*(a[i-1]+a[i-2]);
	}
	while(~scanf("%d",&n)){
		printf("%lld\n",a[n-1]);
	}
	
	return 0;
}
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值