递推算法PPT课件

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.
7
知识迁移:昆虫繁殖
Description:科学家在热带森林中发现了一种特殊的昆虫, 这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对 卵要过两个月长成成虫。假设每个成虫不死,第一个月只有 一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵), 问过Z个月以后,共有成虫多少对? 0=<X<=20,1<=Y<=20,X=<Z<=50< font> Input:x,y,z的数值 Output:过Z个月以后,共有成虫对数 Sample Input:1 2 8 Sample Output:37
• 对一个试题,我们要是能找到后一项与前一项的关系并清 楚其起始条件(或最终结果),问题就可以递推了,接下 来便是让计算机一步步了。让高速的计算机从事这种重复 运算,真正起到“物尽其用”的效果。
.
4
递推概念
给定一个数的序列H0,H1,…,Hn,…若存在将 Hn与其前面的某些项Hi(0<i<n)联系起来, 这样的式子就叫做递推关系。
n=3 f(3)=4: 1 1 1 ; 2 1; 1 2; 3 n=4 f(4)=7: 1 1 1 1 ; 2 1 1; 1 2 1; 3 1 ; 1 1 2; 2 2 ; 1 3
递推方程: F(n)=f(n-1)+f(n-2)+f(n-3) 边界条件: f(1)=1 fБайду номын сангаас2)=2 f(3)=4
.
14
作: • A[i+k*x+2]:=A[i+k*x+2]+A[i]*y (1<=k,i+k*x+2<=z+1) • 因为A [i]的求得只与A[1]~A[i-1]有关,即可用递推求法。 • 则总共的成虫个数为:
z1
ans A[i] i1
.
10
#include<iostream> using namespace std; int main() { long long i,k,a[1000]={0},x,y,z,sum=0;
.
2
解答
• 由问题,可写出递推方程 • 边界条件:f[0]=0;f[1]=1; • 递推公式:f[i]=f[i-1]+f[i-2];
算法: f[0]=1;f[1]= 2; for(i=2;i<=n;i++) f[i]=f[i–1]+f[i–2];
.
3
总结
• 从这个问题可以看出,在计算裴波那契数列的每一项目时, 都可以由前两项推出。这样,相邻两项之间的变化有一定 的规律性,我们可以将这种规律归纳成如下简捷的递推关 系式:Fn=g(Fn-1),这就在数的序列中,建立起后项和前 项之间的关系。然后从初始条件(或是最终结果)入手, 按递推关系式递推,直至求出最终结果(或初始值)。很 多问题就是这样逐步求解的。
递推算法
.
1
引例:Fibonacci数列
• Fibonacci数列的代表问题是由意大利著名 数学家Fibonacci于1202年提出的“兔子繁 殖问题”(又称“Fibonacci问题”)。
• 问题: 一个数列的第0项为0,第1项为1,以
后每一项都是前两项的和,这个数列就是 著名的裴波那契数列,求裴波那契数列的 第N项。
堆。后面的猴子也和第1只进行了同样的做法,请问N只猴子
进行了同样做法后这一堆桃子至少还剩了多少个桃子(假设剩
下的每堆中至少有一个桃子)?而最初时的那堆桃子至少有多
少个?
Input:输入包含二个数据,数据间用空格隔开。第一个数据
为猴子的只数N(1≤N≤10),第二个数据为桃子分成的堆数
M(2≤M≤7)。
递推举例6 : Hanoi塔问题
• Hanoi塔由n个大小不同的圆盘和三根木柱a,b,c 组成。开始时,这n个圆盘由大到小依次套在a柱 上,如图1所示。要求把a柱上n个圆盘按下述规 则移到c柱上:
cin>>x>>y>>z;a[1]=1; for(i=1;i<=z+1;i++)
for(k=1;k<=z+1;k++) a[i+k*x+2]+=y*a[i];
for(i=1;i<=z+1;i++)sum+=a[i]; cout<<sum<<endl; return 0; }
.
11
顺推举例3——杨辉三角1547
Output:输出包含两行数据,第一行数据为剩下的桃子数,
第二行数据为原来的桃子数。
Sample Input:3 2
Sample Output
1
15
.
13
迭代举例5——楼梯走法
问题描述:设有一个N级楼梯,某人每步可以走1级、2级、或者 3级,求某人从底层开始走完全部楼梯的走法。
n=1 f(1)=1: 1 n=2 f(2)=2: 1 1; 2
.
8
分析
• 首先我们来看样例:每隔1个月产2对卵,求过8 月(即第8+1=9月)的成虫个数
月份
1 23 4 5
新增卵b[i] 0 2 2 2 6 成虫a[i] 1 1 1 3 5
67 8 9 … 10 14 26 46 … 7 13 23 37 …
.
9
分析
• 设数组A[i]表示第i月新增的成虫个数。 • 由于新成虫每过x个月产y对卵,则可对每个A[i]作如下操
如何建立递推关系 递推关系有何性质 如何求解递推关系
.
5
递推的分类
递推分倒推法和顺推法两种形式。 1、顺推法: 从已知条件出发,逐步推出要解决的问题。 2、逆推法:从问题出发,逐步推到已知条件。
算法流程如下:
.
6
顺推举例2——兔子繁殖问题1559
Description:有一对小兔,过一个月之后长成大兔,到第四个 月就可以生下一对小兔,并且以后每个月都 生下一对小兔。而 所生的一对小兔也同样到一个月之后长成大兔,到第四个月就 可以生下一 对小兔,并且以后也每个月都生下一对小兔.假设所 有的兔子均不死亡,问第n个月后共有多少对兔子?请设计一 个程序,解决这一问题。 Input:一个整数n(n <= 50) Output:第n个月后共有多少对兔子 Sample Input:5 Sample Output:3
1
a[1][1]=1
11
a[2][1]=1
121
a[2][2]=1
1331
a[i][j]=a[i-1][j-1]+a[i-1][j]
14641
………………
.
12
逆推举例4——猴子摘桃1012
Description:有一堆桃子和N只猴子,第一只猴子将桃子平
均分成了M堆后,还剩了1个,它吃了剩下的一个,并拿走一
相关文档
最新文档