1、递推关系的建立及在信息学竞赛中的应用 - -递推关系的建立及在信息学竞赛中的应用【关键字】递推关系 建立 应用【摘 要】世界上的一切事物都在不经意之中变化着,在这纷繁的变幻中,许多现象的变化是有规律可循的。这种规律往往呈现出前因和后果的关系,故我们可以运用递推的思想去研究这些变化。本文着重说明了递推关系的建立,并在此基础上简略介绍求解递推关系的方法。接着,阐明递推关系与动态规划之间的关系,并比较了一般递推关系与动态规划之间的异同,同时举例说明递推关系在竞赛中的应用。在文章的最后,总结出学好递推关系,不仅可以提高我们的数学素质,对信息学竞赛更是大有帮助。目录【正 文】 第 02 页一、引论 第
2、02 页 二、递推 关系 的定义 第 02 页三、递推 关系 的建立 第 02 页五 种典型的递推关系 第 03 页 递推关系 的求解方法 第 06 页四、递 推关 系的应用 第 06 页五、 总结 第 10 页【附 录】 第 10 页【参考 书目】 第 12 页递推关系的建立及在信息学竞赛中的应用 - -【程序 描述】 第 12 页 【正 文】、 引论瞬息变幻的世界,每一件事物都在随时间的流逝发生着微妙的变化。而在这纷繁的变幻中,许多现象的变化是有规律的,这种规律往往呈现出前因和后果的关系。即是说,某种现象的变化结果与紧靠它前面变化的一个或一些结果紧密关联。所谓“三岁看老” ,说的就是这个道
3、理。这一道理也正体现了递推的思想。递推关系几乎在所有的数学分支中都有重要作用,在一切向“更快、更高、更强”看齐的当今信息学奥林匹克竞赛中更因简洁高效而显示出其独具的魅力。在递推关系发挥重要作用的今天,深入研究其性质、特点便成为一件十分必要的事情。本文就将围绕着递推关系的三大基本问题中的如何建立递推关系展开论述,并通过例题说明递推关系在当今信息学竞赛中的应用。、 递推关系的定义相信每个人对递推关系都不陌生,但若要说究竟满足什么样的条件就是递推关系,可能每个人又会有不同的说法。为了更好地研究递推关系,首先让我们明确什么是递推关系。【定义 1】给定一个数的序列 H0,H1,Hn,若存在整数 n0,使
4、当 n n0 时,可以用等号( 或大于号、小于号)将 Hn 与其前面的某些项 Hn(0 i1,m 1)边界条件可以由定义 2 推导出:S2(n,0)=0;S 2(n,1)=1;S 2(n,n)=1;S 2(n,k)=0(kn)。 第二类 Stirling 数在竞赛中较少出现,但在竞赛中也有一些题目与其类似,甚至更为复杂。读者不妨自己来试着建立其中的递推关系。小结:通过上面对五种典型的递推关系建立过程的探讨,可知对待递推类的题目,要具体情况具体分析,通过找到某状态与其前面状态的联系,建立相应的递推关系。2递推关系的求解方法求解递推关系最简单易行的方法是递推,递推是迭代算法中一种用若干步可重复的简
5、单运算来描述复杂数学问题的方法,以便于计算机进行处理。它与递推关系的思想完全一致,由边界条件开始往后逐个推算,在一般情况下,效率较高,编程也非常的方便。但是,我们一般只需要求递推关系的第 n 项,而边界条件与第 n 项前面之间的若干项的信息是我们不需要的,如果采用递推的方法来求解的话,第 n 项之前的每一项都必须计算出来,最后才能得到所需要的第 n 项的值。这是递推无法避免的,从而在一定程度上影响了程序的效率。当然在大多数情况下,采用递推的方法还是可行的,在竞赛中,使用递推的方法编程,通常会在时限内出解。当然,更好的求解方法还有母函数法、迭代归纳法等等,这里就不再一一展开论述了。例如同样是对于
6、 Fibonacci 数列问题:递推的方法要从 F1,F 2 开始逐个推算出 F3,F 4Fn,而利用母函数的方法,则可以得出公式,则可直接求出所需要的任意一项。5)21()(n、 递推关系的应用递推关系的应用十分的广泛,其中一个非常重要的应用就是著名的杨辉三角(又称 “Pascal 三角” ,见图 5)。杨辉三角是根据组合公式 3Crnrn1递推关系的建立及在信息学竞赛中的应用 - -画出来的。很显然,组合公式、杨辉三角都属于递推关系的范围。在今天的信息学竞赛中,递推关系的应用也日趋广泛,下面就让我们从近年来的两道竞赛题中体会递推关系的应用。例 1(1998 蚌埠市竞赛复试第一题)有一只经过
7、训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。试求出蜜蜂从蜂房 a 爬到蜂房 b 的可能路线数。解:这是一道很典型的 Fibonacci 数列类题目,其中的递推关系很明显。由于“蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行”的限制,决定了蜜蜂到 b 点的路径只能是从 b-1 点或 b-2 点到达的,故 fn=fn-1+fn-2 (a+2 n b),边界条件fa=1, fa+1=1。(附有程序 Pro_1.Pas)例 2(1998 合肥市竞赛复试第二题)同一平面内的 n(n 500)条直线,已知有p(p 2)条直线相交于同一点,则这 n 条直线最多能将平面分割成多少个不同的区域?解:这道题目与第一
8、部分中的平面分割问题十分相似,不同之处就在于线条的曲直以及是否存在共点线条。由于共点直线的特殊性,我们决定先考虑 p 条相交于一点的直线,然后再考虑剩下的 n-p 条直线。首先可以直接求出 p 条相交于一点的直线将平面划分成的区域数为 2p 个,然后在平面上已经有 k(k p)条直线的基础上,加上一条直线,最多可以与 k 条直线相交,而每次相交都会增加一个区域,与最后一条直线相交后,由于直线可以无限延伸,还会再增加一个区域。所以 fm=fm-1+m (mp),边界条件在前面已经计算过了,是 fp=2p。虽然这题看上去有两个参数,但是在实际做题中会发现,本题还是属于带一个参数的递推关系。(附有程
9、序 Pro_2.Pas)3 5 7 9 11 134 6 8 10 12 14 图 611 1111111112334645 10 10 5n=1n=2n=3n=4n=5r=0r=1r=2r=3r=4图 5递推关系的建立及在信息学竞赛中的应用 - -上面的两道例题之中的递推关系比较明显,说它们属于的递推关系类的试题,相信没有人会质疑。下面再让我们来看另一道题目。例 3(1999 江苏省组队选拔赛试题第二题)在一个 nm 的方格中,m 为奇数,放置有 nm 个数,如图 7:方格中间的下方有一人,此人可按照五个方向前进但不能越出方格。如图8 所示:人每走过一个方格必须取此方格中的数。要求找到一条从
10、底到顶的路径,使其数相加之和为最大。输出和的最大值。解:这题在本质上类似于第一题,都是从一个点可以到达的点计算出可以到达一个点的所有可能点,然后从中发掘它们的关系。我们用坐标(x,y)唯一确定一个点,其中(m,n) 表示图的右上角,而人的出发点是 ,受人前进方02/,m向的限制,能直接到达点(x,y)的点只有(x+2,y-1), (x+1,y-1),(x,y-1),(x-1,y-1),(x-2,y-1)。到点(x,y)的路径中和最大的路径必然要从到 (x+2,y-1),(x+1,y-1),(x,y-1),(x-1,y-1),(x-2,y-1) 的几条路径中产生,既然要求最优方案,当然要挑一条和
11、最大的路径,关系式如下:F x,y= MaxFx+2,y-1 ,Fx+1,y-1,Fx,y-1,Fx-1,y-1,Fx-2,y-1+Numx,y,其中 Numx,y 表示 (x,y) 点上的数字。边界条件为: ,0,2/m。(附有程序 Pro_3.Pas)2/1(0, mxx 且看到上面的题目,肯定有人会说,这不是递推关系的应用,这是动态规划;上面的关系式也不是递推关系,而是动态转移方程。为什么呢?因为关系式中有取最大值运算(Max),所以它属于动态规划。是吗?递推关系的定义中只要求“用等号( 或大于号、小于号)将 H(n)与其前面的某些项 H(i)(0 iFi+1,F i+2-Fi=Fi+1
12、 且 Fi+1 是 Fibonacci 数计算机无法通过一种取牌方案,使计算机在某一次取过少于Fi+1/2 张牌后,剩下 Fi+1 张牌当剩下 Fi+1 张牌的时候,必然轮到计算机取,且计算机这时不能一次将所有牌取完F i+1 是 Fibonacci 数计算机一定会输又p (Fi+1,Fi+2),即剩下 p 张牌轮到人取的时候,人一定获胜,p 是必赢牌数3.由 1、2 可得结论成立。 证毕。【参考书目】1杨振生 编著 王树禾 审 组合数学及其算法 中国科技大学出版社 19972孙淑玲 许胤龙 组合数学引论 中国科技大学出版社出版 19993卢开澄 组合数学 清华大学出版社 19914吴文虎 王
13、建德 青少年国际和全国信息学(计算机 )奥林匹克竞赛指导组合数学的算法与程序设计 清华大学出版社 19975吴文虎 主编 信息学(计算机)奥林匹克高级本 北京大学出版社 19926吴文虎 主编 信息学(计算机)奥林匹克中级本 北京大学出版社 1992【程序描述】Pro_1.Pasprogram Pro_1;蜂巢问题,最大范围:目标点与出发点之差不超过 40000typeTarr=array110000 of byte;Tnum=array14 of Tarr;Tlen=array14 of word;varstart,finish:longint;出发点和目标点num:Tnum;num1num
14、3分别保存到达相邻三个蜂巢的路径数;num4是用于交换的临时变量len:Tlen;递推关系的建立及在信息学竞赛中的应用 - -leni表示 numi的长度procedure DataInit;数据初始化 vari:integer;beginfor i:=1 to 3 dobeginnew(numi);fillchar(numi,sizeof(numi),0);numi1:=1; leni:=1;end;end;procedure Add;高精度加法运算:num3=num1+num2vari,carry:word;carry 是进位数字begincarry:=0;for i:=1 to len2
15、 dobegincarry:=carry+num2i+num1i;num3i:=carry mod 10;carry:=carry div 10;end;len3:=i;if carry0 thenbegininc(len3);num3i+1:=carry;end;end;procedure Work;求从出发点到目标点的路径总数vari:longint;beginnum11:=1; num21:=1;for i:=start+2 to finish dobeginAdd;高精度加法运算: num3=num1+num2num4:=num1;num1:=num2;num2:=num3;递推关系的
16、建立及在信息学竞赛中的应用 - -num3:=num4;len4:=len1;move(len2,len1,6);end;end;procedure Out;输出结果vari:integer;beginfor i:=len2 downto 1 dowrite(num2i);writeln;end;beginDataInit; 数据初始化write(Input: );readln(start,finish);Work; 求从出发点到目标点的路径总数Out; 输出结果end.Pro_2.Pasprogram Pro_2;第二种平面分割问题varn,p,total,i:longint;total 是
17、区域总数beginwrite(n=); readln(n);write(p=); readln(p);total:=p*2;for i:=p+1 to n do inc(total,i); 也可用 total:=(p+n+1*(n-p) div 2writeln(Total Area:,total);end.Pro_3.Pasprogram Pro_3;取数constInfns=Pro_3.in;Sign=-10000000;不可到达的点的标志typeTarr=array0100,1101 of longint;varnum:Tarr;保存每个点上的数字 递推关系的建立及在信息学竞赛中的应用
18、- -sum:Tarr; 保存到每个点的和最大是多少n, 方格的高度m:integer; 方格的宽度procedure ReadIn;读入数据并初始化varni,mi:integer;beginassign(Input,Infns);reset(Input);readln(n,m);new(num);for ni:=n downto 1 dofor mi:=1 to m dobeginread(numni,mi);end;for mi:=1 to m dosum0,mi:=Sign; 置不可到达的点的标志sum0,m div 2+1:=0;人的出发点close(Input);end;proce
19、dure Work;找到每个点的和最大的路径的和是多少varni,mi,dir:integer;max:longint;beginfor ni:=1 to n dofor mi:=1 to m dobeginmax:=sign;for dir:=-2 to 2 doif (mi+dir0) and (mi+dirmax)then max:=sumni-1,mi+dir;if maxsign then sumni,mi:=max+numni,mielse sumni,mi:=max;end;end;procedure FindMax;找出和最大的路径的和是多少 varmi:integer;max
20、:longint;递推关系的建立及在信息学竞赛中的应用 - -beginmax:=sign;for mi:=1 to m doif sumn,mimax then max:=sumn,mi;writeln(Max=,max)end;beginReadIn; 读入数据并初始化Work; 找到每个点的和最大的路径的和是多少FindMax; 找出和最大的路径的和是多少end.Pro_4.Pasprogram Pro_4;博弈问题varYouget, 人取了多少张牌total:integer; 现在还剩下多少张牌procedure GetYourAnswer(Iget:integer);读取人这次取多
21、少张牌beginrepeatwrite(You: ); readln(Youget);until (Youget0) and (Youget=n then 是否能够一次取完 beginwriteln(I: ,n); dec(total,n); writeln(Remain: ,total); exit;end;a1:=0; a2:=1; a3:=1;while a3=a2) or (n-a2Youget*2)then Work(n-a2)else beginwriteln(I: ,n-a2);递推关系的建立及在信息学竞赛中的应用 - -dec(total,n-a2); writeln(Remain: ,total);end;GetYourAnswer(n-a2); 读取人这次取多少张牌 Work(a2-Youget);end;begin 主程序write(Total card: ); readln(total);Youget:=(total-1) div 2; 通过限定 Youget 给计算机可以取的最大牌数限界Work(total); 对 total 张牌设计一种取法使计算机能取到最后一张牌writeln(I win!);end.