- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信息学竞赛辅导4-1递推递归--青少年教育精选.ppt
程序 Var n,i,j:integer; a:array[1..100,1..100] of integer; Begin readln(n); for i:=1 to n do for j:=1 to i do read(a[i,j]); for i:=n-1 downto 1 do for j:=1 to i do if a[i+1,j]=a[i+1,j+1] then // else ;j+1]; writeln(a[1,1]); End. a[1,1] a[i,j]:=a[i,j]+a[i+1,j] a[i,j]: =a[i,j]+a[i+1,j+1]; * drdgthtrhtrj 【例5】序列 问题描述 有一个非递减的整数序列S1,S2,S3,……,Sn+1(Si=Si+1)。定义序列m1,m2,…,mn-为S的“M序列”,其中mi=(Si+Si+1)/2。 例如,S=(1, 3, 3, 5),则m=(2, 3, 4)。 现在给你序列m,要你求有多少个S序列的“M序列”是序列m。 输入(sequence.in) 第一行一个整数n, 下接n行,每行一个整数mi 输出(sequence.out) 一个整数,表示有多少个S序列的“M序列”是序列m * drdgthtrhtrj 输入样例 3 2 5 9 输出样例 4 样例说明:存在如下四个数列S满足要求: 2,2,8,10; 1,3,7,11; 0,4,6,12; -1,5,5,13。 数据范围 50%的数据n=1000,mi=20000 100%的数据2=n=100000,mi=109 * drdgthtrhtrj 算法分析 令S序列的第一项为k,那么后面几项就可以写成关于k的多项式: S1=k S2=2*m1-k S3=2*m2-2*m1+k …… 然后根据S序列的非递减性质,有S1=S2=S3=…. 所以有 k=2*m1-k 2*m1-k=2*m2-2*m1+k …… * drdgthtrhtrj 可以得到n个关于k的不等式,而且都是有规律的,可以在O(n)的时间内解出形如 a=k=b 的结果。 由于k的值和S序列是一一对应的,所以k的取值的个数(b-a)就是满足要求的S序列的个数。 * drdgthtrhtrj 递归算法是把处理问题的方法定义成与原问题处理方法相同的过程,在处理问题的过程中又调用自身定义的函数或过程。 递 归 法 设一个未知函数f,用其自身构成的已知函数g来定义: f(n)=g(n,f(n-1)) n0 f(0)=a n=0 (递归边界) 为了定义f(n),必须先定义f(n-1),为了定义f(n-1),又必须先定义f(n-2)…,上述这种用自身的简单情况来定义自己的方式称为递归定义。 * drdgthtrhtrj 递推:由边界条件出发,通过递推式求f(n)的值,从边界到求解的全过程十分清楚; 递归:从函数自身出发来达到边界条件。在通往边界条件的递归调用过程中,系统用堆栈把每次调用的中间结果(局部变量和返回地址值)保存在栈区,直至求出递归边界值f(0)=a。然后返回调用函数。返回过程中,中间结果相继出栈恢复,f(1)=g(1,a) → f(2)=g(2,f(1)) →…→ 直至求出f(n)=g(n,f(n-1))。 * drdgthtrhtrj [例1] 植树节那天,有五位参加了植树活动,他们完成植树的棵数都不相同。问第一位同学植了多少棵时,他指着旁边的第二位同学说比他多植了两棵;追问第二位同学,他又说比第三位同学多植了两棵;…如此,都说比另一位同学多植两棵。最后问到第五位同学时,他说自己植了10棵。到底第一位同学植了多少棵树? [算法分析] 把原问题求第一位同学在植树棵数a1,转化为a1=a2+2;即求a2;而求a2又转化为a2=a3+2; a3=a4+2; a4=a5+2;逐层转化为求a2,a3,a4,a5且都采用与求a1相同的方法;最后的a5为已知,则用a5=10返回到上一层并代入计算出a4;又用a4的值代入上一层去求a3;...,如此,直到求出a1。因此有: 其中求a x+1
文档评论(0)