您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > ACM课件(lecture-03)递推
ACM程序设计第三讲递推求解2020/1/12先来看一个超级简单的例题:有5人坐在一起,当问第5个人多少岁,他说比第4个人大2岁,问第4个人多少岁,他说比第3个人大2岁,依此下去,问第一个人多少岁,他说他10岁,最后求第5个人多少岁?如果所坐的不是5人而是n人,写出第n个人的年龄表达式。2020/1/13显然可以得到如下公式:化简后的公式:F(n)=10+(n-1)*22020/1/14再来一个简单题:20132020/1/152013蟠桃记第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?2020/1/16递推公式?F(n)=(F(n-1)+1)*22020/1/17Fibnacci数列:即:1、2、3、5、8、13、21、34…2020/1/18思考:递推公式的伟大意义——?有了公式,人工计算的方法?常见的编程实现方法?(优缺点?)注意:如果你不能直接求出解析式,可用递推,但不要用递归2020/1/19用如下程序测试一下递归的次数#includestdio.hintt=0;longf(intn){t++;if(n2)return1;elsereturnf(n-1)+f(n-2);}intmain(){printf(%ld\n,f(15));printf(“函数调用次数:%d\n,t);}2020/1/110简单思考题:在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。2020/1/111是不是这个——F(1)=2;F(n)=F(n-1)+n;化简后:F(n)=n(n+1)/2+1;第n条直线与前n-1条直线有n-1个交点,第n条直线被分成n条线段,每条线段将一个区域一分为二2020/1/112太简单了?来个稍微麻烦一些的2020/1/113例:(2050)折线分割平面问题描述:平面上有n条折线,问这些折线最多能将平面分割成多少块?2020/1/114输入输出样例样例输入12样例输出272020/1/115思考2分钟:如何解决?2020/1/116分析当第n个折线加入时,已有f(n-1)个平面,有2(n-1)条折线,第n条折线将与这2(n-1)条折线构成4(n-1)个交点,将使平面多4(n-1)个区域,而第n条折线的顶点将使平面多一个区域故:f(n)=f(n-1)+4(n-1)+12020/1/117结论:Fn=2n(2n+1)/2+1-2n=2n^2–n+1为什么?2020/1/118总结:递推求解的基本方法:首先,确认:能否容易的得到简单情况的解?然后,假设:规模为N-1的情况已经得到解决。最后,重点分析:当规模扩大到N时,如何枚举出所有的情况,并且要确保对于每一种子情况都能用已经得到的数据解决。强调:1、编程中的空间换时间的思想2、并不一定只是从N-1到N的分析2020/1/119编程中的空间换时间的思想2013蟠桃记——程序一#includestdio.hintmain(){intn,i,s;while(scanf(%d,&n)!=EOF){s=1;for(i=2;i=n;i++)s=(s+1)*2;printf(%ld\n,s);}return0;}2020/1/120编程中的空间换时间的思想2013蟠桃记——程序二#includestdio.hintmain(){intn,i;inta[31];a[1]=1;for(i=2;i30;i++)a[i]=(a[i-1]+1)*2;while(scanf(%d,&n)!=EOF){printf(%d\n,a[n]);}return0;}2020/1/12164位整数的使用_int64a[60];printf(%I64d\n,a[n])2020/1/122问题的提出:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。思考题:平面分割方法2020/1/123F(1)=2F(n)=F(n-1)+2(n-1)简单分析——11324123465781234567108911121314n=1n=2n=3n=422020/1/124某人写了n封信和n个信封,如果所有的信都装错了信封。求所有的信都装错信封,共有多少种不同情况。1465不容易系列之一2020/1/125分析思路:1、当N=1和2时,易得解~,假设F(N-1)和F(N-2)已经得到,重点分析下面的情况:4、后者简单,只能是没装错的那封和第N封交换信封,没装错的那封可以是前面N-1封中的任意一个,故有F(N-2)*(N-1)种两种情况相加F(N)=(N-1)(F(N-1)+F(N-2)3、前者,对于每种错装,可从N-1封信中任意取一封和第N封错装,故有F(N-1)*(N-1)种2、当有N封信的时候,前面N-1封信可以有N-1或者N-2封错装2020/1/126得到如下递推公式:基本形式:d[1]=0;d[2]=1递归式:d[n]=(n-1)*(d[n-1]+d[n-2])这就是著名的错排公式2020/1/127在2×n的长方形方格中,用n个1×2的骨牌铺满方格,例如n=3时,为2×3方格,骨牌的铺放方案有三种(如图),输入n,输出铺放方案的总数思考题(2046):2020/1/128归纳分析F(n-2)F(n-1)F(n)=f(n-1)+f(n-2)2020/1/129有1×n的一个长方形,用1×1、1×2、1×3的骨牌铺满方格。例如当n=3时为1×3的方格(如图),此时用1×1,1×2,1×3的骨牌铺满方格,共有四种铺法。输入:n(0=n=30);输出:铺法总数再思考题:2020/1/130仔细分析最后一个格的铺法,发现无非是用1×1,1×2,1×3三种铺法,很容易就可以得出:f(n)=f(n-1)+f(n-2)+f(n-3);其中f(1)=1,f(2)=2,f(3)=4典型例题分析过程:2020/1/131最后一个思考题(有点难度)1297Children’sQueue有n个人组成的队列,不能有单个女生排在队列中,要么没有女生,要么至少两个女生相邻。N=4的情况:FFFF,FFFM,MFFF,FFMM,MFFM,MMFF,MMMM2020/1/132分析过程(1)设:F(n)表示n个人的合法队列,则:按照最后一个人的性别分析,他要么是男,要么是女,所以可以分两大类讨论:1、如果n个人的合法队列的最后一个人是男,则对前面n-1个人的队列没有任何限制,他只要站在最后即可,所以,这种情况一共有F(n-1);2020/1/1332、如果n个人的合法队列的最后一个人是女,则要求队列的第n-1个人务必也是女生,这就是说,限定了最后两个人必须都是女生,这又可以分两种情况:分析过程(2)2020/1/1342.1、如果队列的前n-2个人是合法的队列,则显然后面再加两个女生,也一定是合法的,这种情况有F(n-2);分析过程(3)2020/1/1352.2、但是,难点在于,即使前面n-2个人不是合法的队列(队尾是女生,她前面是男生),加上两个女生也有可能是合法的,当然,这种长度为n-2的不合法队列,不合法的地方必须是尾巴,就是说,这里说的长度是n-2的不合法串的形式必须是“F(n-4)+男+女”,这种情况一共有F(n-4).分析过程(4)2020/1/136结论:所以,通过以上的分析,可以得到递推的通项公式:F(n)=F(n-1)+F(n-2)+F(n-4)(n3)然后就是对n=3的一些特殊情况的处理了,显然:F(0)=1(没有人也是合法的,这个可以特殊处理,就像0的阶乘定义为1一样)F(1)=1F(2)=2F(3)=42020/1/137提示:1297用64位整数无法实现,要用数组模拟大整数才能实现2020/1/1382045不容易系列之(3)——LELE的RPG难题有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.附加思考题(1):2020/1/139分析此题公式为f(n)=f(n-1)+f(n-2)*2(n=4)1.若前n-1合法,则首尾不同,再添1个时,只有1种方法;2.若前n-1不合法,而添1个时合法,即只是因为首尾相同引起的不合法,这样前n-2必定合法。此时第n个的添加有2种方法。3.f(1)=3;f(2)=6;f(3)=6.至此,可得。2020/1/1401480_钥匙计数之二一把钥匙有N个槽,2N26槽深为1,2,3,4,5,6。每钥匙至少有3个不同的深度且相连的槽其深度之差不得为5。求这样的钥匙的总数。本题无输入对2N26,输出满足要求的钥匙的总数。附加思考题(2):2020/1/141详见解题报告:=2294&page=1&toread=1仔细阅读,耐心品味,关键掌握从n-1到n的推导过程。Anyquestion?2020/1/143课后任务:一、DIY在线作业(3):2008《ACMProgramming》Exercise(3)_递推求解二、常规练习(包含以上作业)1290献给杭电五十周年校庆的礼物1297Children’sQueue1438钥匙计数之一1480钥匙计数之二2013蟠桃记2018母牛的故事1465,1466,2041,20422044~2050(2006/10/05专题练习)
本文标题:ACM课件(lecture-03)递推
链接地址:https://www.777doc.com/doc-2437482 .html