递推思想

由ACM2047引出:

原题:

今年的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

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

本题用到递推思想,看了众多博客解释,本人结合这一题归纳下。

此题用到递推中的逆推 我们设第n项共有f(n)种情况 那么f(n)如何用f(n-1)表示呢 很简单 f(n)=f0(n-1)*2+f1(n-1)*3(其中f0(n-1)和f1(n-1)分别表示f(n-1)中为0的个数和非0的个数) 现在f1(n-1)和f0(n-1)的个数其实是不好表示的 打过程序的应该知道 所以我们可以继续递推 f0(n-1)如何用f(n-2) f1(n-1)如何用f(n-1)表示呢 现在如果我们表示出来了 就可以算成功了 因为f1(n-1)和f0(n-2)都统一为了f(n-2) 这样是很好表示的。

OK,那么如何表示呢!你可以列几项观察下 易发现f1(n-1)=f(n-2)*2 你看f(n-1)为e f时 其后面非O得项有2*f(n-2)个 f(n-2)为O时 其后面也只能跟 e f 顾f1(n-1)=f(n-2)*2

非0的得出了 那是0的个数不就是f(n-1)-f1(n-1)=f(n-1)-(f(n-2)*2)吗!

最后带入到前面得出的f(n)=f0(n-1)*2+f1(n-1)*3 得到f(n)=(f(n-1)+f(n-2))*2  这下代码就很好写了 循环也行 递归也行

总结 此题若无这些数学推导 根据其题目的意思按步骤写代码是很难写的 或者说写不出来 如此足以说明数学的重要性

时间: 2024-11-05 18:45:26

递推思想的相关文章

十七、斐波那契数列 【递推思想(迭代思想)解决】

 递推思想本身并不跟函数有直接关系(虽然常常写在函数中). 其基本思路为: 为了解决一个"大"问题,根据现实逻辑,如果能够找到同类问题的一个"最小问题"的答案(通常是已知的),并且根据已知算法,又可以因此得到比最小问题"大一级"问题的答案. 而且,依次类推,又可以得到再大一级问题的答案,最终就可以得到"最大那个问题"(即要解决的问题)的答案. 可见,该思想的过程依赖与2个条件: 1,可知同类最小问题的答案: 2,大一级问题

第一篇 递推思想

<1> 顺推的例子 上过大学的应该都知道著名的“斐波那契”数列吧,说的是繁殖兔子的问题,题目我就大概说一下. 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,1年后能 繁殖多少兔子? 思路:其实这个问题我们可以将兔子划分为“1月大的兔子“,”2月大的兔子“,”3月大的兔子“. ① 初始时:            一对1月大小兔子,总数为1对. ② 第一个月:         1月大的小兔子变成2月大的兔子,总数还是1对. ③ 第二个

算法之递推思想

一: 概念 通过已知条件,利用特定关系逐步递推,最终得到结果为止,核心就是不断的利用现有信息推导出新的东西. 二:分类 当然递推中有两种,"顺推"和"逆推" 顺推:从条件推出结果. 逆推:从结果推出条件. 三: 举例 <1> 顺推的例子 上过大学的应该都知道著名的"斐波那契"数列吧,说的是繁殖兔子的问题,题目我就大概说一下. 如果1对兔子每月能生1对小兔子,而每对小兔在它出生后的第3个月就可以生1对小兔子,如果从1对初生的小兔子开始,

SOJ【栈】射击游戏(递推思想)

Description 小明很喜欢玩射击游戏.这周末,他完成了数据结构作业之后,又来到了射击娱乐场.他从老板那租了一把步枪和装有N发子弹的弹夹.注意:所有的子弹都从枪口上膛.在射击的过程中,小明每次都有两种选择:从弹夹中取出一颗子弹上膛,或者打一发子弹出去.恰巧,这周二,小明刚上了数据结构中<栈>那一章,于是,他想通过“栈”的数据结构来算出究竟有多少种不同的子弹打出顺序.假设N颗子弹的编号为1,2,…,N.子弹从弹夹中取出的顺序也是从1到N.你可以帮小明解决这个问题吗? Input 可能有多个

C语言 分支与循环 递推思想

条件语句 开关控制语句(SWITCH语句) 象坐电梯一样,break是按的楼层,不加break则会一直执行下去. 上面程序有细节BUG,边界测试输入-5,105时由于整除会得到错误的结果. 解决方法: 循环 当型循环与直到型循环的差别在于第一次执行时条件是否为真 关于逗号运算符   递推  又分正向递推和反向递推 #include<stdio.h> int main() { int x,n; n=1; x=1; while(n<=9)//需要递推9次 { x=2*(x+1); n++;

递推2 2046

#include<stdio.h> int main(void){ __int64 a[50]={1,2,3}; int n; for(int i=3;i<50;i++) { a[i]=2*a[i-1]-a[i-3];//看了很多别人AC过的答案 都是用斐波那契数列 我用递推思想直接推出来的是这个 用斐波那契数列也可以间接推出这个 才发现a[i]=2*a[i-1]-a[i-3]也是斐波那契数列的一种形式 #include<stdio.h> int main(void){ __

算法入门——递推

主要思想: 通过已知的条件(已知结果),利用特定的关系,逐步递推(顺推/逆推),直到有解或者无解. 主要分为两种:顺推,从已知条件出发,直至推出解. 逆推,从已知结果出发,直至推出解. 需要注意的:每一递推结果,都是下一步递推的条件. 顺推: 斐波那契数列  F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*) 实例 兔子的总数有多少? 一对兔子,每月能生一对,而每对兔子3个月后可以生育.求12个月后共有多少兔子. #include<stdio.h> #define

poj 2506 Tiling 递推

题目链接: http://poj.org/problem?id=2506 题目描述: 有2*1和2*2两种瓷片,问铺成2*n的图形有多少种方法? 解题思路: 利用递推思想,2*n可以由2*(n-1)的状态加上一块竖放2*1的瓷片转移得来,也可以由2*(n-2)的状态加上一块2*2的瓷片或者加上两块横放的2*1的瓷片转移得来. 可得出递推公式:dp[n] = dp[n-1] + dp[n-2]*2: ac秘诀: (1):从输出样例可以看出要用大数来表示,大概需要90位左右. (2):2*0不是零种

三维递推dp Logo Turtle CodeForces - 132C

https://vjudge.net/problem/CodeForces-132C 题意:   F表示向前走,T表示向后转,有N次修改字符的机会,问最多能走多远 思路:dp[ i ][ j ][ d ]表示前i个字符修改了j次,走了k长度,当前朝向是d的状态的最大长度 所以就可以递推一个关系式,分第i个字符为‘F‘ or ‘T‘时 然后多维递推dp就是当前 i.j都是由 老i.j递推出来的,即 i-1,j-k,其实就是记忆化暴力. 注意:要用max就得先全部初始化为-inf,然后dp[0][0