NOIP基础算法综合教案资料.ppt
《NOIP基础算法综合教案资料.ppt》由会员分享,可在线阅读,更多相关《NOIP基础算法综合教案资料.ppt(93页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、NOIP基础算法综合第一节第一节 枚举算法枚举算法四、枚举法的优缺点枚举法的优点:枚举法的优点:由于枚举算法一般是现实问题的“直译”,且是建立在考察大量状态、甚至是穷举所有状态的基础之上的,因此比较直观,易于理解,其算法的正确性也比较容易证明。枚举法的缺点:枚举法的缺点:枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较低。例题1:砝码称重砝码称重【问题描述问题描述】设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重=1000),求用这些砝码能称出不同的重量个数。【文件输入文件输入】输入1g、2g、3g、5g、10g、20g的砝码个数。【文件输出文件输出】输出
2、能称出不同重量的个数。【样例输入样例输入】1 1 0 0 0 0【样例输出样例输出】3 3例题1:砝码称重砝码称重【思路点拨思路点拨】根据输入的砝码信息,每种砝码可用的最大个数是确定的,而且每种砝码的个数是连续的,能取0到最大个数,所以符合枚举法的两个条件,可以使用枚举法。枚举时,重量可以由1g,2g,20g砝码中的任何一个或者多个构成,枚举对象可以确定为6种重量的砝码,范围为每种砝码的个数。判定时,只需判断这次得到的重量是新得到的,还是前一次已经得到的,即判重。由于重量=1000g,所以,可以开一个a1001的数组来判重 例题1:砝码称重砝码称重伪代码如下:memset(a,0,sizeof
3、(a);for(c1=0;c1=a;c1+)/1g砝码的个数砝码的个数 for(c2=0;c2=b;c2+)/2g砝码的个数砝码的个数for(c3=0;c3=c;c3+)/3g砝码的个数砝码的个数 for(c4=0;c4=d;c4+)/5g砝码的个数砝码的个数 for(c5=0;c5=e;c5+)/10g砝码的个数砝码的个数 for(c6=0;c6=f;c6+)/20g砝码的个数砝码的个数 sum=0;for(i=1;i=6;i+)sum=sum+ci*wi;asum=1;/标记标记 for(i=1;i=1000;i+)if(ai)num+;/统计不同重量的个数统计不同重量的个数coutnum
4、=0)3.n(n=24)根火柴棍必须全部用上 例题2:火柴棒等式(火柴棒等式(NOIP2008NOIP2008)【问题简述问题简述】给你n(n=A,满足条件的A的最大取值为1111。所以枚举A和B的范围是从01111。为了加快速度,可以将0到2222的所有整数需要的火柴棒数目提前算好保存在数组中。五、枚举算法的优化枚举算法的优化 枚举算法的时间复杂度:状态总数枚举算法的时间复杂度:状态总数*单个状态的耗时单个状态的耗时主要优化方法:主要优化方法:减少状态总数减少状态总数 降低单个状态的考察代价降低单个状态的考察代价优化过程从以下几个方面考虑:优化过程从以下几个方面考虑:枚举对象的选取枚举对象的
5、选取 枚举方法的确定枚举方法的确定 采用局部枚举或引进其他算法采用局部枚举或引进其他算法【例题例题3 3】给你给你n n个整数,然后要有个整数,然后要有mm个询问。问第个询问。问第i i个数字到第个数字到第j j个数字所有数字之和。个数字所有数字之和。【朴素算法朴素算法】cinn;for(i=1;iai;for(i=1;ixy;sum=0;for(j=x;j=y;j+)sum+=aj;coutsumn;for(i=1;iai;si=si-1+ai;for(i=1;ixy;coutsy-sx-1endl;【例题例题4 4】最大子矩阵问题最大子矩阵问题【问题描述问题描述】给定一个二维的数组(含正数
6、或负数),请从中找出和最大的子矩阵。例如:【例题例题4 4】最大子矩阵问题最大子矩阵问题1、“直译直译”枚举过程枚举过程for(x1=1;x1=n;x1+)/枚举矩形左上角枚举矩形左上角(x1,y1)for(y1=1;y1=n;y1+)for(x2=1;X2=n;X2+)/枚举矩形右下角枚举矩形右下角(x2,y2)for(y2=1;y2=n;y2+)考察状态左上角为考察状态左上角为(x1,y1)右下角为右下角为(x2,y2)内矩形的元素之和;内矩形的元素之和;设设map为数字矩阵;为数字矩阵;sum为当前矩形内元素的和;为当前矩形内元素的和;best为最优解。考察过为最优解。考察过程如下:程如
7、下:sum=0;for(x=x1;x=x2;x+)/计算当前矩形内元素的和计算当前矩形内元素的和for(y=y1;ybest)best=sum;/调整最优解调整最优解这个算法相当粗糙,枚举状态的费用为这个算法相当粗糙,枚举状态的费用为O(n6)2、从减少重复计算入手、从减少重复计算入手有刚才一维情况可以推广到二维,在统计左上角为有刚才一维情况可以推广到二维,在统计左上角为(x1,y1)右下角为右下角为(x2,y2)内矩形的元素之和时,我们同样可以先初始化,计算出左上角为内矩形的元素之和时,我们同样可以先初始化,计算出左上角为(1,1)右下角为右下角为(x,y)内矩形的元素之和内矩形的元素之和s
8、xy。for(x1=1;x1=n;x1+)/枚举矩形左上角枚举矩形左上角(x1,y1)for(y1=1;y1mapij;sij=si-1j+sij-1-si-1j-1+mapij;对于状态左上角为对于状态左上角为(x1,y1)右下角为右下角为(x2,y2)内矩形的元素之和,可以改为:内矩形的元素之和,可以改为:sum=sx2y2-sx1-1y2-sx2y1-1+sx1-1y1-1;if(sumbest)best=sum;/调整最优解调整最优解由于利用了计算出的结果,整个算法的时间复杂度降为由于利用了计算出的结果,整个算法的时间复杂度降为O(n4)【例题例题4 4】最大子矩阵问题最大子矩阵问题3
9、、提取恰当的信息、提取恰当的信息 容易观察到,最大子矩阵问题是最大连续子序列和问题的提升,即将一条线换成一个面,将一维问题提升到二维问题。所以我们计算最大子矩阵的方法就是将一行行的数进行累加以求得最大值。但是还有一个问题,那就是应该如何高效地存储矩阵?我们可以想到:在一个一维的数列中,设数组bi表示从第1个元素到第i个元素的和,则如果想要求第i个元素到第j个元素的和,只需要计算bj-bi-1的值就行了。由此推广到二维矩阵,设bij表示矩阵第j列前i个元素的和,aij表示元素数据,则压缩存储:for(i=1;i=n;i+)for(j=1;jaij;bij=bi-1j+aij;因此,我们可以使用三
10、重循环求出所有的矩形值,即枚举起始行i和终止行j,压缩子矩形成为一行,变成一维求最大字段和问题。即tk=max(tk-1,0)+bjk-bi-1k;时间复杂度为O(n3)【例题例题4 4】最大子矩阵问题最大子矩阵问题核心代码核心代码sum=-0 x7fffffff;for(i=1;i=n;i+)/阶段阶段:起始行起始行for(j=i;j=n;j+)/状态状态:结束行结束行t1=bj1-bi-11;/初始化第初始化第1列的值列的值for(k=2;ksum)sum=tk;coutsumnnn0 0时时,可以用等号可以用等号(或大于号、或大于号、小于号小于号)将将H Hn n与其前面的某些项与其前面
11、的某些项H Hi i(0in)(0in)联联系起来,这样的式子就叫做递推关系。系起来,这样的式子就叫做递推关系。解决递推问题的一般步骤解决递推问题的一般步骤 n 建立递推关系式建立递推关系式n确定边界条件确定边界条件n递推求解递推求解 递推的形式递推的形式l顺推法和倒推法顺推法和倒推法递推的应用分类递推的应用分类 l 一般递推问题一般递推问题l 组合计数类问题组合计数类问题l 一类博弈问题的求解一类博弈问题的求解l 动态规划问题的递推关系动态规划问题的递推关系例题例题1 1:faibonaccifaibonacci数列数列【问题描述问题描述】已知faibonacci数列的前几个数分别为0,1,
12、1,2,3,5,编程求出此数列的第n项。(n=60)递推的应用(一般递推问题)递推的应用(一般递推问题)递推的应用(一般递推问题)递推的应用(一般递推问题)【例题例题2 2】输出杨辉三角的前输出杨辉三角的前N N行行【问题描述问题描述】输出杨辉三角的前N行(N10)。【文件输入文件输入】输入只有一行,包括1个整数N(N=2)个盘子时,总是先借助c柱把上面的n-1个盘子移动到b柱上,然后把a柱最下面的盘子移动到c柱上;再借助a柱把b柱上的n-1个盘子移动到c柱上;总共移动hn-1+1+hn-1个盘次。hn=2hn-1+1 边界条件:h1=1思考:思考:HanoiHanoi双塔问题双塔问题 递推的
13、应用(一般递推问题)递推的应用(一般递推问题)【例题例题4 4】数的计数数的计数 【问题描述问题描述】我们要求找出具有下列性质数的个数我们要求找出具有下列性质数的个数(包含输包含输入的自然数入的自然数n)n),先输入一个自然数,先输入一个自然数n(n1000)n(n1000),然后对此,然后对此自然数按照如下方法进行处理:自然数按照如下方法进行处理:l.l.不作任何处理;不作任何处理;2.2.在它的左边加上一个自然数,但该自然数不能超过在它的左边加上一个自然数,但该自然数不能超过原数的一半;原数的一半;3.3.加上数后,继续按此规则进行处理,直到不能再而加上数后,继续按此规则进行处理,直到不能
14、再而 自然数为止;自然数为止;方法方法1 1:用递推用递推。用hn表示自然数n所能扩展的数据个数,则:h1=1,h2=2,h3=2,h4=4,h5=4,h6=6,h7=6,h8=10,h9=10。分析上数据,可得递推公式:hi=1+h1+h2+hi/2。时间复杂度O(n2)。方法方法2 2:是对方法:是对方法1 1的改进的改进。我们定义数组s.s(x)=h(1)+h(2)+h(x),h(x)=s(x)-s(x-1)此算法的时间复杂度可降到O(n)。方法方法3 3:还是用递推:还是用递推。只要做仔细分析,其实我们还可以得到以下的递推公式:(1)当i为奇数时,h(i)=h(i-1);(2)当i为偶
15、数时,h(i)=h(i-1)+h(i/2);【思考思考】1.1.若若n=10000n=10000怎么计算;怎么计算;2.2.若若n=3000000n=3000000怎么计算;怎么计算;递推的应用(一般递推问题)递推的应用(一般递推问题)例题例题5 5:猴子吃桃问题:猴子吃桃问题15381538猴子吃桃问题。猴子摘了一堆桃,第一天吃了一猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还嫌不过瘾,又吃了一个;第二天又吃了剩半,还嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个;以后每天如此。到第下的一半零一个;以后每天如此。到第n n天,猴子天,猴子一看只剩下一个了。问最初有多少个桃子?一看只剩下
16、一个了。问最初有多少个桃子?【扩展练习扩展练习】猴子分桃猴子分桃 【问题描述问题描述】有一堆桃子和N只猴子,第一只猴子将桃子平均分成了M堆后,还剩了1个,它吃了剩下的一个,并拿走一堆。后面的猴子也和第1只进行了同样的做法,请问N只猴子进行了同样做法后这一堆桃子至少还剩了多少个桃子(假设剩下的每堆中至少有一个桃子)?而最初时的那堆桃子至少有多少个?【文件输入文件输入】输入包含二个数据,数据间用空格隔开。第一个数据为猴子的只数N(1N10),第二个数据为桃子分成的堆数M(2M7)。【文件输出文件输出】输出包含两行数据,第一行数据为剩下的桃子数,第二行数据为原来的桃子数。【样例输入样例输入】3 2
17、【样例输出样例输出】1 15递推的应用(一般递推问题)递推的应用(一般递推问题)【例题例题6 6】传球游戏(传球游戏(NOIP2008NOIP2008普及)普及)23092309【问题描述问题描述】上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:n(3=n=30)个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可
18、以使得从小蛮手里开始传的球,传了m(3=m2-3-1和1-3-2-1,共两种。分析设fik表示从小蛮开始,从小蛮开始,经过k次传到编号为i的人手中的方案数,传到i号同学的球只能来自于i的左边一个同学和右边一个同学,这两个同学的编号分别是i-1和i+1,所以可以得到以下的递推公式:fik=fi-1k-1+fi+1k-1f1k=fnk-1+f2k-1,当i=1时fnk=fn-1k-1+f1k-1,当i=n时边界条件:f10=1;结果在f1m中。参考代码cinnm;memset(f,0,sizeof(f);f10=1;for(k=1;k=m;k+)f1k=f2k-1+fnk-1;for(i=2;i=
19、n-1;i+)fik=fi-1k-1+fi+1k-1;fnk=fn-1k-1+f1k-1;coutf1mendl;样例输入3 3样例输出2具体过程 见右图数组的填充过程 按列递推的应用(组合计数)递推的应用(组合计数)Catalan数定义:Cn=n+2条边的多边形,能被分割成三角形的方案数,例如5边型的分割方案有:如图,有一个正n+2边形。任取一边,从这边的端点开始,依次给顶点编号为:0,1,2,3,.,n,n+1(所取的边端点编号为:0,n+1)。这样,除线段所在顶点外,还有n个顶点:1,2,3,n。我们以该线段为三角形的一条边,另一个顶点为i(1=i=n)。我们设题意要求的三角形剖分方案数
20、为H(n),即除线段顶点(编号0与n+1)外,还有n个顶点时的三角形剖分方案为H(n)。则以顶点0,i为指定线段(上面还有1,2,i-1,共i-1个顶点)的剖分数位H(i-1);以顶点n+1,i为指定线段的剖分数为H(n-i)。根据乘法原理,以0,i,n+1为一剖分三角形的剖分数应为:H(i-1)*H(n-i),i=1,2,n,所得的剖分各不相同,根据加法原理则有:这与Catalan数C(n)的表达式是一致的。故本题答案为H(n)=C(n)。具具体体实实现现时时,若若直直接接用用上上述述公公式式计计算算,对对数数字字的的精精度度要要求求较较高。可将其化高。可将其化为递为递推式推式再再进进行行递
21、递推推计计算算,并并且且注注意意类类型型的的定定义义要要用用long long长长整整型。型。Catalan数的应用(部分和序列)问题:n个1和n个0组成一2n位的二进制,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少?【类似1】将n个1和n个-1排成一行,要求第1个数至第k个数的累加和均非负,问有几种排列方法?【类似2】有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少种方法使得只要有10元的人买票,售票处就有5元的钞票找零?Catalan数的应用(栈 NOIp2003)问题:一个栈(无穷大)的进栈序
22、列为1,2,3,.n,有多少个不同的出栈序列?Catalan数的应用(加括号)P=A1A2A3An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?【分析分析】P(4):即4个数相乘的情况如下:(a1a2)a3)a4);(a1(a2a3)a4);(a1a2)(a3a4);(a1(a2a3)a4);(a1(a2(a3a4)。不失一般性,可以假设最后一次乘法运算如下:(a1ar)(ar+1an),(1=r=n)。令P(n)表示n个数乘积的n-1对括号插入的不同方案数,则:P(n)=p1pn-1+p2pn-2+.+pn-1p1,p1=p2=1 有:P(n+1)=p1pn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 基础 算法 综合 教案 资料
限制150内