ACM课件(lecture_03)递推
递推算法.完美版PPT

5
7
38
810
2744
45265 【算法分析】
此题解法有多种,从递推的思想出发,设想,当从顶层沿某条路径走到第I 层向第I+1层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方 向前进,为此,我们可以采用倒推的手法,设a[i,j]存放从i,j 出发到达n层的最 大值,则a[i,j]=max{a[i,j]+a[i+1,j],a[i,j]+a[i+1,j+1]},a[1,1] 即为所求的数字总 和的最大值。
1.计算正方形的个数s1 边长为1的正方形个数为n*m 边长为2的正方形个数为(n-1)*(m-1)边长Biblioteka 3的正方形个数为(n-2)*(m-2)
………… 边长为min{n,m}的正方形个数为(m-min{n,m}+1)*(n-min{n,m}+1) 根据加法原理得出
m inm{,n}1
s1= (ni)*(mi) i0
(4)当N=3时:骨牌可以全部竖排,也可以认为在方格中已经有一个竖排 骨牌,则需要在方格中排列两个横排骨牌(无重复方法),若已经在方格中排 列两个横排骨牌,则必须在方格中排列一个竖排骨牌。如上右图,再无其他排 列方法,因此铺法总数表示为x3=3. 由此可以看出,当n=3时的排列骨牌的方法数是n=1和n=2排列方法数的和。
第三章 递推算法
递推法是一种重要的数学方法,在数学的各个领域中都 有广泛的运用,也是计算机用于数值计算的一个重要算法。 这种算法特点是:一个问题的求解需一系列的计算,在已知 条件和所求问题之间总存在着某种相互联系的关系,在计算 时,如果可以找到前后过程之间的数量关系(即递推式), 那么,从问题出发逐步推到已知条件,此种方法叫逆推。无 论顺推还是逆推,其关键是要找到递推式。这种处理问题的 方法能使复杂运算化为若干步重复的简单运算,充分发挥出 计算机擅长于重复处理的特点。
ACM课件递推求解new

说明1:“Z”的两端应看成射线 说明2:“Z”的两条射线规定为平行的
19 2020/1/14
总结:递推求解的基本方法:
首先确认,是否能很容易的得到简单情 况的解
假设规模为N-1的情况已经得到解决
重点分析:当规模扩大到N时,如何枚举出所 有的情况,并且要确保对于每一种子情况都 能用已经得到的数据解决。
一把钥匙有N个槽,2<N<26槽深为1,2,3, 4,5,6。每钥匙至少有3个不同的深度且相连的槽 其深度之差不得为5。求这样的钥匙的总数。
本题无输入
对2<N<26,输出满足要求的钥匙的总数。
34 2020/1/14
详见解题报告:
/forum/read.php?tid=2294&pa ge=1&toread=1
仔细阅读,耐心品味,关键掌握从n-1到 n的推导过程。
35 2020/1/14
Any question?
36 2020/1/14
HDOJ作业:
1290 献给杭电五十周年校庆的礼物
1297 Children’s Queue 1438 钥匙计数之一 1465 不容易系列之一 1466 计算直线的交点数 1480 钥匙计数之二 2019 蟠桃记 2018 母牛的故事 2041 超级楼梯 2042 不容易系列之二 2044~2050 (10/5专题练习)
为什么?
17 2020/1/14
趁热打铁, 来个差不多的
18 2020/1/14
附加思考题(还没加到OJ): “佐罗”的烦恼
说起佐罗,大家首先想到的除了他脸上的面具, 恐怕还有他每次刻下的“Z”字。我们知道,一 个“Z”可以把平面分为2部分,两个“Z”可以把 平面分为12部分,那么,现在的问题是:如果 平面上有n个“Z”,平面最多可以分割为几部分 呢?
(HDUACM2011版_03)递推求解

强调: 1、编程中的空间换时间的思想 2、并不一定只是从N-1到N的分析
2020/4/2
15
思考题:平面分割方法
问题的提出: 设有n条封闭曲线画在平面上,而任何
两条封闭曲线恰好相交于两点,且任何三 条封闭曲线不相交于同一点,问这些封闭 曲线把平面分割成的区域个数。
2020/4/2
24
分析过程(4)
2.2、但是,难点在于,即使前面n-2个 人不是合法的队列,加上两个女生也有 可能是合法的,当然,这种长度为n-2 的不合法队列,不合法的地方必须是尾 巴,就是说,这里说的长度是n-2的不 合法串的形式必须是“F(n-4)+男+ 女”,这种情况一共有F(n-4).
2020/4/2
10
太简单了?
来个稍微麻烦一些的☺
2020/4/2
11
例:(2050)折线分割平面
问题描述: 平面上有n条折线,问这些折线最多能将平面分割 成多少块?
样例输入 1 2
样例输出 2 7
2020/4/2
12
思考:如何用递推解决?
结论—— F(n)=F(n-1)+4(n1)+1
2020/4/2
13
另外一种结论:
Zn = 2n ( 2n + 1 ) / 2 + 1 - 2n = 2 n^2 – n + 1
为什么?
2020/4/2
14
总结:递推求解的基本方法:
首先,确认:能否容易的得到简单情况的解?
然后,假设:规模为N-1的情况已经得到解 决最后。,重点分析:当规模扩大到N时,如何枚
2020/4/2
ACM递推算法、贪心算法、DP算法、母函数

递推算法----一只小蜜蜂
递推算法----不容易系列之(3)----LELE的RPG难题
递推算法----骨牌铺方格
递推算法----阿牛的EOF牛肉串
递推算法----不容易系列之(4)----考新郎
递推算法----神、上帝以及老天爷
递推算法----拆线分割平面
递推算法----不容易系列之(1)
递推算法----Children's Queue
贪心算法----今年暑假不AC
贪心算法----room
贪心算法----wooden sticks / setup time
贪心算法----赛马
贪心算法----homework
DP算法----sequence / max sum of a sub-sequence
DP算法----chess / Super Jumping ! Jumping ! Jumping !
DP算法----数塔
DP算法----n条直线(无三线共点),求交点数
DP算法----FatMouse
DP算法----find maximum-legth common subsequence
母函数----硬币、整数拆分
母函数----钱N兑换成硬币(用的是递归方法,不是母函数)
母函数----本·拉登
母函数----
母函数----Computer College。
acm递推求解

acm递推求解不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!商人,不佩剑;超级楼梯timelimit:2000/1000ms(java/other)memorylimit:65536/32768k(java/other)totalsubmission(s):0acceptedsubmission(s):0problemdescription有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少种走法?input输入数据首先包含一个整数n,表示测试实例的个数,然后是n行数据,每行包含一个整数m(1<=m<=40),表示楼梯的级数。
output对于每个测试实例,请输出不同走法的数量sampleinput223sampleoutput12authorlcysource2021实验班长学期考试我的错误代码#include<stdio.h>intmain(){intn,i,j,m;intcount=0;while(scanf("%d",&n)!=eof){scanf("%d",&m);while(n--){for(i=0;i<=m;i++){for(j=0;j<=(int)(m/2);j++){if(i+2*j==m)count++;}}}printf("%d\\n",count);count=0;}return0;}当你抵达第n阶的时候存有两种抵达方式。
在n-1处上1个楼梯。
在n-2处上2个楼梯。
所以上n阶楼梯的情况总数=上n-1的总数+上n-2的总数这样递推公式就出来了。
f(n)=f(n-1)+f(n-2)11111111111#include<stdio.h>ints[41];intmain(){intt,n;scanf("%d",&t);s[1]=s[2]=1;//第一级到第二级只一种,就在第一级当然只一种。
ACM培训精品PPT课件

自己过滤空格?麻烦!
输入输出
读一个非空白字符, 方法一:
char str[2]; scanf(“%1s”, str); // %1s扫描前导空白,并且只读一个字符 char c = str[0]; 方法二: 强制扫描空白 在%前面加上一个空格表示“强制扫描前导空白” scanf(“ %c”, &ch); 前面那个读人物信息的完整scanf语句:
LCS (Longest Common Subsequence) 最长 公共子串
输入输出
C:
scanf printf
C++:
cin cout
速度快 格式容易控制
使用简单, 自动识别类型 格式控制较麻烦
数据规模较大时, 推荐(必须)使用scanf 以 避免超时(TLE)
输入输出
cout: 带缓冲输出 printf: 不带缓冲输出
Ctrl+Z 2.最好不要把C和C++的输入输出语句混着用,会造成一些莫名其妙的问题 3.我个人倾向于使用纯C的输入输出,因为方便且速度快。
关于重定向操作
当程序要输入的内容很多时,从文件读入的操作变得非常重 要,特别是需要调试时,这样可以避免你反复的从键盘敲入重
复的内容。
使用标准输入语句,可以使用重定向命令行
scanf(“%s %c %s”, name, &gender, ability);
输入输出
同理,我们也可以用其它字符来扫描其它类型 的无关输入
比如,输入年月日的信息
2007-08-03 scanf(“%d-%d-%d”, &y, &m, &d); 其它类似
浮点数的输入问题
为什么说while(in!=0.00)不合理呢? 如果不合理应该怎么判断!!
递推算法分析课件

定义与特点
定义
递推算法是一种通过已知信息逐步推 导出其他信息的方法,通常从一个初 始状态出发,按照一定的规则逐步推 导出最终结果。
特点
递推算法具有明确性、可计算性和可 实现性,能够根据已知信息逐步推导 出结果,适用于解决一些具有规律性 的问题。
递推算法的分类
线性递推
根据已知的线性关系式,逐步推导出最终结果, 如等差数列求和等。
研究如何提高递推算法的稳定 性,减少初始值对结果的影响
,提高结果的可靠性。
探索新的应用场景
挖掘递推算法在其他领域的应 用潜力,如物理、化学、生物 等学科中的复杂问题求解。
REPORT
THANKS
感谢观看
CATALOG
DATE
ANALYSIS
SUMMAR Y
O(2^n)等。
03
递推算法时间复杂度分析
递推算法的时间复杂度取决于递推关系的复杂度和递归深度。通过分析
递推关系,可以估算算法的时间复杂度,并比较不同算法的效率。
空间复杂度
1 2 3
空间复杂度定义
空间复杂度是衡量算法所需存储空间随输入规模 增长而增长的量级,也用大O表示法表示。
递归与堆栈空间
递归算法需要使用堆栈来保存递归过程中的状态 ,因此其空间复杂度通常较高。迭代算法则通常 只需少量额外空间。
要点二
详细描述
杨辉三角是一个由数字组成的三角形,每个数字是它正上 方和左上方的两个数字之和。从第二行开始,每个数字都 是上一行相邻两个数字之和。通过递推关系式,我们可以 依次生成每个数字,最终得到完整的杨辉三角。
插入排序算法的改进
总结词
插入排序算法是一种简单的排序算法,通过将元素逐个 插入到已排序序列中实现排序。
第3讲__递推专题讲座_acm

第3讲 递推递推是一种应用非常广泛的常用算法之一,与下一章的递归有着密切的联系。
本章探讨递推在求解数列、数阵以及计数等应用案例方面的应用。
3.1 递推概述在纷繁变幻的世界,所有事物都随时间的流逝发生着微妙的变化。
许多现象的变化是有规律可循的,这种规律往往呈现出前因后果的关系。
某种现象的变化结果与紧靠它前面变化的一个或一些结果紧密关联。
递推的思想正体现了这一变化规律。
3.1.1 递推算法所谓递推,是在命题归纳时,可以由n −k,…,n −1的情形推得n 的情形。
一个线性递推可以形式地写成11()n n k n k a c a c a f n --=+++ 其中f(n)=0时递推是齐次的,否则是非齐次的。
递推的一般解法要用到n 次方程的求根。
递推关系是一种高效的数学模型,是组合数学中的一个重要解题方法,在组合计数中有着广泛的应用。
在概率方面利用递推可以解决一类基本事件个数较大的概率问题。
在对多项式的求解过程中,很多情况可以使用递推算法来实现。
在行列式方面,某些n 阶行列式只用初等变换难以解决,但如果采用递推求解则显得较为容易。
递推关系不仅在各数学分支中发挥着重要的作用,由它所体现出来的递推思想在各学科领域中更是显示出其独特的魅力。
递推是利用问题本身所具有的一种递推关系求解问题的一种方法。
设要求问题规模为n 的解,当n=1时,解或为已知,或能非常方便地得到解。
能采用递推法构造算法的递推性质,能从已求得的规模为1,2,…,i −1的一系列解,构造出问题规模为i 的解。
这样,程序可从i=0或i=1出发,重复地由已知至i −1规模的解,通过递推,获得规模为i 的解,直至得到规模为n 的解。
递推算法的基本思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法充分利用了计算机的运算速度快和不知疲倦的特点,从头开始一步步地推出问题最终的结果。
使用递推算法编程,既可使程序简练,又可节省计算时间。
对于一个序列来说,如果已知它的通项公式,那么要求出数列中某项之值或求数列的前n项之和是简单的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结论:
Fn = 2n ( 2n + 1 ) / 2 + 1 - 2n = 2 n^2 – n + 1
为什么?
2014-12-7
23
总结:递推求解的基本方法:
首先,确认:能否容易的得到简单情况的解?
然后,假设:规模为N-1的情况已经得到解决。 最后,重点分析:当规模扩大到N时,如何枚 举出所有的情况,并且要确保对于每一种子 情况都能用已经得到的数据解决。
2014-12-7
46
分析
此题公式为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.至此,可得。
2014-12-7 两种情况相加 F(N)= (N-1)(F(N-1)+F(N-2) 31
得到如下递推公式:
基本形式:d[1]=0; d[2]=1 递归式:d[n]= (n-1)*( d[n-1] + d[n-2])
这就是著名的错排公式
2014-12-7
32
思考题-骨牌铺方格(2046)
在2×n的长方形方格中,用n个1×2的骨牌铺满方格, 例如n=3时,为2×3方格,骨牌的铺放方案有三种(如 图), 输入n ,输出铺放方案的总数
4. 输入样例
4 5 2 19 1
2014-12-7
5. 输出样例 5 1 4181 1
10
解题思路
这个题目要求很明确,因为a的规模很小, 所以递归调用不会产生栈溢出的问题。 设第n项值为f(n),则f(n)=f(n-1)+f(n-2)。 已知f(1)=1,f(2)=1,则从第3项开始, 可以用公式求。
2014-12-7
33
推理:
假设用arr[i]表示2*i的方格一共有组成的方法数, 我们知道arr[1]=1;arr[2]=2;arr[3]=3 假设已经知道了arr[i-1]和arr[i-2],求arr[i],所谓 arr[i],不过是在2*(i-1)的格子后边加上一格2*1的 方格罢了,骨牌在这一格上横着放,竖着放,如果 前面i-1块已经铺好,则第i块只有一种铺法,就是竖 着放,如果要横着放,也只有一种铺法,不过要求 前面i-2块已经铺好! 因此arr[i]=arr[i-1]+arr[i-2];
2014-12-7
8
Fibnacci 数列:
2. 输入数据 第一行是测试数据的组数n,后面跟着n 行输入。每组测试数据占1行,包括一个 正整数a(1=<a<=20)。 3.输出要求 输出有n行,每行输出对应一个输入。 输出应是一个正整数,为斐波那契数列 中第a个数的大小。
9
2014-12-7
2014-12-7 47
附加思考题(2):
1480_钥匙计数之二
一把钥匙有N个槽,2<N<26槽深为1,2,3,4,5,6。每 钥匙至少有3个不同的深度且相连的槽其深度之差不得 为5。求这样的钥匙的总数。 本题无输入
强调: 1、编程中的空间换时间的思想 2、并不一定只是从N-1到N的分析
2014-12-7 24
2013蟠桃记——程序一 #include<stdio.h> int main() { int n,i,s;
编程中的空间换时间的思想
}
while(scanf("%d",&n)!=EOF) { s=1; for(i=2;i<=n;i++) s=(s+1)*2; printf("%ld\n",s); } return 0;
2014-12-7
28
简单分析——
14 2 1 1 2 4 3 5 3 1 4 7 2 8 10 11 6 9 6 2 1 4 8 7 3 12 5 13
n=1
n=2
n=3
n=4
F(1)=2 F(n)=F(n-1)+2(n-1)
2014-12-7 29
1465 不容易系列之一
某人写了n封信和n个信封,如果 所有的信都装错了信封。求所有 的信都装错信封,共有多少种不 同情况。
2014-12-7 34
归纳分析
F(n-2)
F(n-1)
F(n)=f(n-1)+f(n-2)
2014-12-7 35
递推公式
f(1)=1, f(2)=2 f(n)=f(n-1)+f(n-2), 当n>=3时
2014-12-7
36
再思考题:
有1×n的一个长方形,用1×1、1×2、1×3的骨牌铺 满方格。例如当n=3时为1×3的方格(如图),此时用 1×1,1×2,1×3的骨牌铺满方格,共有四种铺法。
ACM程序设计
第三讲
递归求解
先来看一个超级简单的例题:
有5人坐在一起,当问第5个人多少岁, 他说比第4个人大2岁,问第4个人多少 岁,他说比第3个人大2岁,依此下去, 问第一个人多少岁,他说他10岁,最 后求第5个人多少岁? 如果所坐的不是5人而是n人,写出第 n个人的年龄表达式。
2
2014-12-7
2014-12-7
15
简单思考题:
在一个平面上有一个圆和n条直 线,这些直线中每一条在圆内同 其他直线相交,假设没有3条直 线相交于一点,试问这些直线将 圆分成多少区域。
2014-12-7 16
第n条直线与前n-1条直线有n-1个交点,第n 条直线被分成n条线段,每条线段将一个区 域一分为二
38
最后一个思考题(有点难度)
1297 Children’s Queue
N=4的情况: FFFF, FFFM, MFFF, FFMM, MFFM, MMFF, MMMM
有n个人组成的队列,不能有单个女生排在队列中,要么பைடு நூலகம்没有女生,要么至少两个女生相邻。
2014-12-7 39
分析过程(1)
设:F(n)表示n个人的合法队列,则:
19
输入输出样例
样例输入 1 2 样例输出 2 7
2014-12-7 20
思考2分钟:如何解决?
2014-12-7
21
分析
当第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)+1
2014-12-7
5
分析
第1天 第2天
……
?
倒数第n天 倒数第n-1天 …… 倒数第1天
第n天 剩余1个
2014-12-7
6
递推公式?
F(n)=(F(n-1)+1)*2
2014-12-7
7
斐波那契数列
1.问题描述: 斐波那契数列是指这样的数列:数列的 第一个和第二个数都为1,接下来每个数 都等于前面2个数之和。给出一个正整数 a,要求斐波那契数列中第a个数是多少。
输入: n(0<=n<=30); 输出: 铺法总数
2014-12-7
37
典型例题
分析过程:
仔细分析最后一个格的铺法,发 现无非是用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
2014-12-7
2014-12-7
44
提示:
1297 用64位整数无法实现,要用数组模 拟大整数才能实现
2014-12-7
45
附加思考题(1):
2045 不容易系列之(3) —— LELE的RPG难题
有排成一行的n个方格,用红(Red)、粉 (Pink)、绿(Green)三色涂每个格子,每格涂 一色,要求任何相邻的方格不能同色,且首 尾两格也不同色.求全部的满足要求的涂法.
显然可以得到如下公式:
化简后的公式:
F(n)=10+(n-1)*2
2014-12-7 3
再来一个简单题:2013
2014-12-7
4
2013
蟠桃记
第一天悟空吃掉桃子总数一半多一个, 第二天又将剩下的桃子吃掉一半多一个, 以后每天吃掉前一天剩下的一半多一个, 到第n天准备吃的时候只剩下一个桃子。 聪明的你,请帮悟空算一下,他第一天 开始吃的时候桃子一共有多少个呢?
按照最后一个人的性别分析,他要么是男, 要么是女,所以可以分两大类讨论: 1、如果n个人的合法队列的最后一个人是 男,则对前面n-1个人的队列没有任何限 制,他只要站在最后即可,所以,这种情 况一共有F(n-1);
2014-12-7 40
分析过程(2)
2、如果n个人的合法队列的最后一个 人是女,则要求队列的第n-1个人务必 也是女生,这就是说,限定了最后两 个人必须都是女生,这又可以分两种 情况:
2014-12-7 26
64位整数的使用
_int64 a[60]; printf("%I64d\n",a[n])
2014-12-7
27
思考题:平面分割方法
问题的提出: 设有n条封闭曲线画在平面上,而任 何两条封闭曲线恰好相交于两点,且任何 三条封闭曲线不相交于同一点,问这些封 闭曲线把平面分割成的区域个数。