2022年递推与递归应用 .pdf
《2022年递推与递归应用 .pdf》由会员分享,可在线阅读,更多相关《2022年递推与递归应用 .pdf(16页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Jsoi2010 春季函授讲义(B3)1/16递推与递归应用一、递推思想递推关系 是一种简洁高效的常见数学模型,比如我们熟悉的Fibonacci数列问题,F(1)=0,F(2)=1,在 n2 时有:F(n)=F(n-1)+F(n-2)。在这种类型的问题中,每个数据项都和它前面的若干个数据项(或后面的若干个数据项)有一定的关联,这种关联一般是通过一个 递推关系式 来表示的。求解问题时我们就从初始的一个或若干数据项出发,通过递推关系式逐步推进,从而得到最终结果。这种求解问题的方法叫“递推法”。其中,初始的若干数据项称为“边界”。解决递推类型问题有三个重点:一是如何建立正确的递推关系式,二是递推关系
2、有何性质,三是递推关系式如何求解。其中第一点是基础,也最重要。例 1、过河卒 问题描述 棋盘上 A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图中的C 点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(如下图中的C点和 P1,P2,,,P8)。卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B 点(n,m)(n,m为不超过20 的整数),同样马的位置坐标是需要给出的,C A且 C B。现在从键盘输入n,m,要你计算出卒从A点能够到达 B点的路径的条数。问题分析 跳马是一道很老的题目,一些比赛中也经常出现过这一问
3、题的变形(如NOIP1997初中组第三题)。有些同学一看到这种类型的题目就去盲目搜索,但事实证明:当 n,m=15 就会超时。其实,本题稍加分析就能发现,要到达棋盘上的一个点,只能从左边过来(我们称之为左点)或是从上面过来(我们称之为上点),所以根据加法原理,到达某一点的路径数目,就等于到达其相邻的上点和左点的路径数目之和,因此我们可以使用逐列(或逐行)递推的方法来求出从起点到终点的路径数目。障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0 即可。假设用 Fi,j表示到达点(i,j)的路径数目,用 gi,j表示点(i,j)是否是对方马的控名师资料总结-精品资料欢迎下载-名师精心
4、整理-第 1 页,共 16 页 -Jsoi2010 春季函授讲义(B3)2/16制点,gi,j=0表示不是对方马的控制点,gi,j=1表示是对方马的控制点。则,我们可以得到如下的递推关系式:Fi,j=0 gi,j=1 Fi,0=Fi-1,0 i 0,gi,j=0 F0,j=F0,j-1 j 0,gi,j=0 Fi,j=Fi-1,j+Fi,j-1 i0,j0,gi,j=0 上述递推关系式的边界为:F0,0=1。考虑到最大情况下:n=20,m=20,路径条数可能会超出长整数范围,所以要使用int64类型计数或高精度运算。参考程序 program ex1(input,output);const dx
5、:array1.8 of Shortint=(-2,-1,1,2,2,1,-1,-2);dy:array1.8 of Shortint=(1,2,2,1,-1,-2,-2,-1);var n,m,x,y,i,j:Byte;g:array0.20,0.20 of Byte;f:array0.20,0.20 of Comp;begin Readln(n,m,x,y);Fillchar(g,Sizeof(g),0);gx,y:=1;for i:=1 to 8 do if(x+dxi=0)and(x+dxi=0)and(y+dyi=1000;disk:=1000;置始点至终点的距离值 d1:=1000
6、-disk-1;求贮油点k 处至始点的距离 oilk:=d1*(2*k+1)+oilk-1;求始点藏油量 writeln(No.Distance oil);for i:=0 to k do 输出第 i 个贮油点的距离为1000-disk-i,藏油量为oilk-i;writeln(i:4,1000-disk-i:10:2,oilk-i:12:2);readln;end.例 3骨牌问题(gupai.pas)问题描述 已知 32n 个棋盘格子,试求用火柴棒覆盖所有格子的方法(一根火柴棒可覆盖2个格子)。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 16 页 -Jsoi2010 春季函
7、授讲义(B3)5/16如 n=1 时,有如下3 种覆盖方法:输入:n,n1000。输出:用火柴棒覆盖所有32n 格子的方案数。输入样例:1 输出样例:3 提示:找出一个递推的公式。要采用高精度计算 问题分析 F(1)=3 F(2)=11 F(3)=3*f(2)+2*f(1)+2,f(n)=3f(n-1)+2f(n-2)+2f(n-3)+2f(n-4)+2f(n-5)+.+2f(1)+2 f(n)=3f(n-1)-f(n-2)+(3f(n-2)+2f(n-3)+2f(n-4)+2f(n-5)+.+2f(1)+2)f(n)=3f(n-1)-f(n-2)+f(n-1)f(n)=4f(n-1)-f(n
8、-2)参考程序 const max=1000;var n,i,g,s,j:integer;a,b,c,d:array0.max of integer;begin assign(input,gupai.in);assign(output,gupai.out);reset(input);rewrite(output);readln(n);amax:=3;bmax:=1;bmax-1:=1;for i:=3 to n do begin fillchar(c,sizeof(c),0);g:=0;for j:=max downto 1 do begin s:=bj*4+g;cj:=s mod 10;名师
9、资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 16 页 -Jsoi2010 春季函授讲义(B3)6/16g:=s div 10 end;for j:=max downto 1 do if cjk,k0)。下面,我们来确定S(n,k)的边界条件,首先不能把n 个元素不放进任何一个集合中去,即 k=0 时,S(n,k)0;也不可能在不允许空盒的情况下把n 个元素放进多于n 的 k 个集合中去,即 kn 时,S(n,k)0;再者,把 n 个元素放进一个集合或把n 个元素放进n 个集合,方案数显然都是1,即 k=1 或 k=n 时,S(n,k)=1。因此,我们可以得出划分数S(n,k)的递
10、归关系式为:S(n,k)S(n1,k1)+k*S(n1,k)(nk,k0)S(n,k)0 (nk)或(k 0)S(n,k)1 (k=1)或(k n)参考程序 program ex3(input,output);var n,k:integer;function s(n,k:integer):int64;数据还有可能越界,请用高精度计算 begin if(n0 若直线存在,则递归计算所有的交叉情况 then for r:=m downto 1do try(m-r,j+r*(m-r)else gj1;否则确定m条直线存在j 个交点 end;有了上述递归过程后,我们便可以通过下述方式计算和输出n 条直
11、线的交点方案:1、计算 max:max=2)1(nn;计算 n 条直线的最多交点数 2、初始化:fillchar(g,sizeof(g),0);3、递归求 gi:try(n,0);4、统计方案数并输出:total:=0;for i:=0 to max do if gi=1 then begin total:=total+1;输出第 total个方案为交点数i;end;三、递推与递归应用例 6、Hanoi 塔问题 问题描述 3个柱子的 Hanoi 塔问题,问n 个盘子移动过去,至少要移多少次?问题分析 当 a 柱上有 n(n=2)个盘子时,总是先借助c 柱把上面的n-1 个盘子移动到b 柱上,然
12、后把 a 柱最下面的盘子移动到c 柱上;再借助 a 柱把 b 柱上的 n-1 个盘子移动到c 柱上;所以总共移动:hn-1+1+hn-1次。即:hn=2hn-1+1,边界条件为:h1=1。闭公式:hn =2hn-1+1=4hn-2+3=8hn-3+7=,=2n-1 h1+2n-1-1=2n-1次名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 16 页 -Jsoi2010 春季函授讲义(B3)10/16本质是什么?除了最下面的那个盘子移动了一次,其它n-1 个盘子都至少移动两次。例 7、平面分割问题 问题描述 设有 n 条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年递推与递归应用 2022 年递推 递归 应用
限制150内