NOIP基础算法综合课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《NOIP基础算法综合课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 基础 算法 综合 课件
- 资源描述:
-
1、第一节 枚举算法一、枚举法的基本思想 枚举法的基本思想:根据实际问题设计多重循环,一一枚举所有可能的状态,并用问题给定的约束条件检验哪些状态是需要的,哪些状态是不需要的。能使命题成立的状态,即为其解。虽然枚举法本质上属于搜索策略,但是它与后面讲的回溯法或宽度优先搜索有所不同。二、枚举法的条件:可预先确定每个状态的元素个数n。如百钱买百鸡问题,3文钱一只鸡的状态元素个数可预先确定;可预先确定每个状态元素a1,a2,an的值域。三、枚举法的框架结构 设a11为状态元素ai的最小值;aik为状态元素ai的最大值(1=i=n),即状态元素a1,a2,an的值域分别为a11=a1=a1k,a21=a2=
2、a2k,ai1=ai=aik,an1=an=ank。for(a1=a11;a1=a1k;a1+)for(a2=a21;a2=a2k;a2+).for(ai=ai1;ai=aik;ai+).for(an=an1;an=ank;an+)if(状态(a1,.,ai.,an)满足检验条件)输出问题的解;四、枚举法的优缺点 枚举法的优点:由于枚举算法一般是现实问题的“直译”,且是建立在考察大量状态、甚至是穷举所有状态的基础之上的,因此比较直观,易于理解,其算法的正确性也比较容易证明。枚举法的缺点:枚举算法的效率取决于枚举状态的数量以及单个状态枚举的代价,因此效率比较低。例题1:砝码称重【问题描述】设有1
3、g、2g、3g、5g、10g、20g的砝码各若干枚(其总重=1000),求用这些砝码能称出不同的重量个数。【文件输入】输入1g、2g、3g、5g、10g、20g的砝码个数。【文件输出】输出能称出不同重量的个数。【样例输入】1 1 0 0 0 0【样例输出】3例题1:砝码称重【思路点拨】根据输入的砝码信息,每种砝码可用的最大个数是确定的,而且每种砝码的个数是连续的,能取0到最大个数,所以符合枚举法的两个条件,可以使用枚举法。枚举时,重量可以由1g,2g,20g砝码中的任何一个或者多个构成,枚举对象可以确定为6种重量的砝码,范围为每种砝码的个数。判定时,只需判断这次得到的重量是新得到的,还是前一次
4、已经得到的,即判重。由于重量=1000g,所以,可以开一个a1001的数组来判重 例题1:砝码称重伪代码如下:memset(a,0,sizeof(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;
5、i+)if(ai)num+;/统计不同重量的个数coutnum=0)3.n(n=24)根火柴棍必须全部用上 例题2:火柴棒等式(NOIP2008)【问题简述】给你n(n=A,满足条件的A的最大取值为1111。所以枚举A和B的范围是从01111。为了加快速度,可以将0到2222的所有整数需要的火柴棒数目提前算好保存在数组中。五、枚举算法的优化 枚举算法的时间复杂度:状态总数*单个状态的耗时 主要优化方法:减少状态总数 降低单个状态的考察代价 优化过程从以下几个方面考虑:枚举对象的选取 枚举方法的确定 采用局部枚举或引进其他算法【例题3】给你n个整数,然后要有m个询问。问第i个数字到第j个数字所有
6、数字之和。【朴素算法】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】最大子矩阵问题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
7、;y2+)考察状态左上角为(x1,y1)右下角为(x2,y2)内矩形的元素之和;设map为数字矩阵;sum为当前矩形内元素的和;best为最优解。考察过程如下: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)内矩形的元素之和sxy。for(x1=1;x1=n;x1+)/枚举矩形左上角(
8、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】最大子矩阵问题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;因此,我们可以使用三重循环求出所有的矩形值,即枚举起始行i和终止行j,压缩子矩形成为一行,变成一维求最大字段和问题。即tk=max(tk-1,0)+bjk-bi-1k;时间复杂度为O(n3)【例题4】最大子矩阵问题核心代码 sum=-0 x7
10、fffffff;for(i=1;i=n;i+)/阶段:起始行 for(j=i;j=n;j+)/状态:结束行 t1=bj1-bi-11;/初始化第1列的值 for(k=2;ksum)sum=tk;coutsumn0时,可以用等号(或大于号、小于号)将Hn与其前面的某些项Hi(0in)联系起来,这样的式子就叫做递推关系。解决递推问题的一般步骤 n 建立递推关系式n确定边界条件n递推求解 递推的形式l顺推法和倒推法递推的应用分类 l 一般递推问题l 组合计数类问题l 一类博弈问题的求解l 动态规划问题的递推关系例题1:faibonacci数列【问题描述】已知faibonacci数列的前几个数分别为0
11、,1,1,2,3,5,编程求出此数列的第n项。(n=60)递推的应用(一般递推问题)递推的应用(一般递推问题)【例题2】输出杨辉三角的前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思考:Hanoi双塔问题 递推的应用(一般递推问题)【例题4】数的计数 【问题描述】我们要求找出具有下列性质数的个数(包含输入的自然数n),先输入一
12、个自然数n(n1000),然后对此自然数按照如下方法进行处理:l.不作任何处理;2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;3.加上数后,继续按此规则进行处理,直到不能再而 自然数为止;方法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:是对方法1的改进。我们定义数组s.s(x)=h(1)+h(2)+h(x),h(x)=s(x)-s(x-1)此算法的时间复杂度可降到O(n)。方法3:还是用递推
13、。只要做仔细分析,其实我们还可以得到以下的递推公式:(1)当i为奇数时,h(i)=h(i-1);(2)当i为偶数时,h(i)=h(i-1)+h(i/2);【思考】1.若n=10000怎么计算;2.若n=3000000怎么计算;递推的应用(一般递推问题)例题5:猴子吃桃问题1538 猴子吃桃问题。猴子摘了一堆桃,第一天吃了一半,还嫌不过瘾,又吃了一个;第二天又吃了剩下的一半零一个;以后每天如此。到第n天,猴子一看只剩下一个了。问最初有多少个桃子?【扩展练习】猴子分桃 【问题描述】有一堆桃子和N只猴子,第一只猴子将桃子平均分成了M堆后,还剩了1个,它吃了剩下的一个,并拿走一堆。后面的猴子也和第1只
14、进行了同样的做法,请问N只猴子进行了同样做法后这一堆桃子至少还剩了多少个桃子(假设剩下的每堆中至少有一个桃子)?而最初时的那堆桃子至少有多少个?【文件输入】输入包含二个数据,数据间用空格隔开。第一个数据为猴子的只数N(1N10),第二个数据为桃子分成的堆数M(2M7)。【文件输出】输出包含两行数据,第一行数据为剩下的桃子数,第二行数据为原来的桃子数。【样例输入】3 2 【样例输出】1 15递推的应用(一般递推问题)【例题6】传球游戏(NOIP2008普及)2309【问题描述】上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:n(3=n=3
15、0)个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。聪明的小蛮提出一个有趣的问题:有多少种不同的传球方法可以使得从小蛮手里开始传的球,传了m(3=m2-3-1和1-3-2-1,共两种。分析 设fik表示从小蛮开始,经过k次传到编号为i的人手中的方案数,传到i号同学的球只能来自于i的左边一个同学和右边一个同学,这两个同学的编号分别是i-1和i+1,所以可以得到以下的递推公式:fik=fi-1k-1+fi+1k-1 f1k=
16、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=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边型的分割方案有:如图,有一个正
17、n+2边形。任取一边,从这边的端点开始,依次给顶点编号为:0,1,2,3,.,n,n+1(所取的边端点编号为:0,n+1)。这样,除线段所在顶点外,还有n个顶点:1,2,3,n。我们以该线段为三角形的一条边,另一个顶点为i(1=i=n)。我们设题意要求的三角形剖分方案数为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,
18、所得的剖分各不相同,根据加法原理则有:这与Catalan数C(n)的表达式是一致的。故本题答案为H(n)=C(n)。niinHiHnH1)(*)1()(具体实现时,若直接用上述公式计算,对数字的精度要求较高。可将其化为递推式)1(1)12(*2)(nfnnnf再进行递推计算,并且注意类型的定义要用long long长整型。Catalan数的应用(部分和序列)问题:n个1和n个0组成一2n位的二进制,要求从左到右扫描,1的累计数不小于0的累计数,试求满足这条件的数有多少?【类似1】将n个1和n个-1排成一行,要求第1个数至第k个数的累加和均非负,问有几种排列方法?【类似2】有2n个人排成一行进入
展开阅读全文