算法学习笔记之递推算法

算法学习笔记之递推算法

参考资料:《信息学奥赛一本通 第五版》 目录:

前言

01.递推算法是什么

02.初步了解递推算法

03.经典递推关系:

1.Fibonacci(斐波那契)数列

2.Hanio(汉诺塔)问题

3.平面分割问题

4.Catalan数

5.第二类Stirling数

04.结束语

前言

递推算法是一种应用很广泛的算法,今天我们就来一起学习,递推算法。 首先,我们学习递推算法需要先基本了解它。

01.递推算法是什么

递推算法是一种应用很广泛的算法。不仅是在OI界应用广泛,且在数学界的各个领域都有应用,所以说递推算法可以解决很多问题。递推算法就是根据已知的条件来推导出未知的条件。这种处理问题的方式可以使原本复杂的运算化为若干步重复的简单运算,充分发挥了计算机擅长于重复处理信息的特点。之后我们学习动态规划的时候也会使用到递推算法,而且这两者之间的关系是密不可分的。

02.初步了解递推算法

要使用递推算法,首先要找到题目的边界条件和写出递推公式,这样接下来 的步骤才能进行下去。递推算法,只要你能够写出递推公式和边界条件来,那么你这个程序就已经成功了一半,接下来只要你注意其他细节,那么你这个程序就能通过。

03.经典递推关系

经典递推关系一共分为五类,分别为:Fibonacci数列,Hanio塔问题,平面分割问题,Catalan数以及第二类Stirling数。

1.Fibonacci(斐波那契)数列

在所有的递推关系中,Fibonacci数列应该是最广为人知的一种递推关系了,因此,它的解法也比较简单。Fibonacci数列中最著名的问题是意大利著名数学家Fibonacci于1202年所提出的“兔子繁殖问题” 题面是这样的:有雌雄一对新兔子,假定过两个月便可繁殖一雄一雌一对小兔子,问:过n个月后有多少个兔子(前提是在此期间兔子不会死去)。 解:设满n个月后共有兔子f对,其中当前月份新出生的兔子数目为f(n)对。第n-1个月后留下的兔子数目假设为f(n-1)对,那么边界条件就是f(0)=0 ; f(1)=1;那么递推公式就是:f(n)=f(n-1)+f(n-2) 注:有很多数列问题都可以抽象为斐波那契数列或者转化为其的变形,这是一种经典的递推关系,应用极其广泛。

2.Hanio(汉诺塔)问题

汉诺塔问题是经典递推关系中的第二类。汉诺塔问题也算是一道比较经典的递推题目了。 看题目: Hanio塔由n个大小不同的圆盘和三根木柱子a,b,c组成。开始的时候,这n个圆盘从大到小以此套在a柱上。 要求把a柱上n个圆盘按下列规则移动到c柱上 1.一次只能移动一个圆盘 2.圆盘只能在三个柱子上存放 3.在移动过程中,不允许大盘压小盘 问将这n个盘子从a柱移动到c柱上,总计需要移动多少个盘次。 

解法: 这道题要求让我们求出总计需要移动多少个盘次,那么我们需要根据给出的要求来分析出边界条件和递推公式,所以,首先我们需要分析题意,然后根据题目要求分别写出边界条件和递推条件。首先,设f[n]为从a柱移动到c柱上所需要移动的盘次。很明显,当n等于1的时候,只需要直接把a柱上的盘子移动到c柱上就好了,所以f[n]=1.当n等于2的时候,先将a柱上最小的盘子移动到b柱上,再将a柱上的大盘子移动到c柱上,然后将最小的盘子从b柱移动到c柱上,所以,当n等于2的时候,f[n]=3,也就是需要移动三次。以此类推,当a柱上有n个盘子时(提示:n>=2),总是先借助c柱把上面n+1个盘子移动到b柱上,然后把a柱最底下的盘子移动到c柱上,然后再借助a柱把b柱上的n-1个盘子移动到c柱上,总共移动f[n-1]+1+f[n-1]个盘次。 因此,递推公式为f[n]=2f[n-1]+1,边界f[1]=1

3.平面分割问题

平面分割是指这样的一个问题:假设有n条封闭的曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。 解:设f[n]为n条封闭曲线把平面分割成的个数。我们可以通过画图的方式来推出公式。图片这里就不放了,大家可以自己画。所以,根据此,我们可以看出f[2]-f[1]=2;f[3]-f[2]=4;f[4]-f[3]=6。从我们推出来的这些公式中,我们可以看出f[n]-f[n-1]=2[n-1]。递推公式就是f[n]=f[n-1]+2[n-1],边界条件为a[1]=1。当然,这里的结论是我们通过画图并且观察四幅图得来的,这里只给出解法,而正确性还有待证明。

4.Catalan数

Catalan数首先是由Euler在精确计算对凸n变形的不同的对角三角形剖分的个数问题的时候得到的,它经常出现于在组合计数的问题中。 问题:在一个凸n边形中,通过不相交于n边形内部的对角线,将n边形拆分成若干个三角形,不同的拆分数目用f[n]来表示,f[n]即Catalan数。例如,五边形有五种拆分方式,所以f[5]=5.求对于一个任意的凸n边形相应的f[n0]。

解法:假设f(n)为凸n边形拆分的总方案数目。由题目给出的条件我们可以知道:一个凸n边形的任意一条边都必然会是一个三角形的其中一条边,边q(1),q(n)也同样,我们再根据“不在同一条直线上的三点可以确认为一个三角形”,只要在q(2),q(3)......q(n-1)点钟找到一个点q(a),与q(1),q(n)共同构成一个三角形的三个顶点。就将n边形分成了三个不相交的部分,我们分别称其为区域A,区域B,区域C,其中,区域C必然会是一个三角形,区域A是一个凸n边形,区域B是一个a-n+1边形,区域A的拆分方案总数为a(n)种,区域B的拆分方案总数为a(a-n+1)。考虑到计算的方便,约定边界条件f(n)=1。

5.第二类Stirling数

在五类典型的递推关系中,第二类Stirling数是鲜为人知的。也正是因为如此,所以必须要先解释一下第二类Stirling数是什么东西。 定义:n个有区别的数放到m个相同的盒子中,要求是没有空的盒子,其中,不同的方案用,A(N,M)来表示,称为第二类Stirling数。 第二类Stirling数在竞赛中较少出现,但在竞赛中也有一些题目与其类似,甚至更为复杂。

结束语

通过上面五种经典递推关系建立过程的讨论,可以知晓对待递推类的题目,要具体情况具体分析,找到某个状态与前面状态的联系,从而建立相应的递推关系。

猜你喜欢

转载自www.cnblogs.com/murongxueqing/p/11333922.html