ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:43.42KB ,
资源ID:16725412      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16725412.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++经典算法文档格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++经典算法文档格式.docx

1、 m:=1;a1,1:h:for i:=1 to n do m:=m*2; repeat for i:=1 to h do for j:=1 to h do begin ai,j+h:=ai,j+h;构造右上角方阵 ai+h,j:=ai,j+h;构造左下角方阵 ai+h,j+h:=ai,j;构造右下角方阵 end; h:=h*2; until h=m;=1 to m do begin=1 to m do write(ai,j:4); writeln;end.在分治算法中,若将原问题分解成两个较小的子问题,我们称之为二分法,由于二分法划分简单,所以使用非常广泛。使用二分法与使用枚举法求解问题相比

2、较,时间复杂度由O(N)降到O(log2N),在很多实际问题中,我们可以通过使用二分法,达到提高算法效率的目的,如下面的例子。例2 一元三次方程求解(noip2001tg) 题目大意:给出一个一元三次方程f(x)=ax3+bx2+cx+d=0 ,求它的三个根。所有的根都在区间-100,100中,并保证方程有三个实根,且它们之间的差不小于1。在讲解枚举法时,我们讨论了如何用枚举法求解此题,但如果求解的精度进一步提高,使用枚举法就无能为力了,在此我们再一次讨论如何用二分法求解此题。由题意知(i,i+1)中若有根,则只有一个根,我们枚举根的值域中的每一个整数x(-100x100),设定搜索区间x1,

3、x2,其中x1=x,x2=x+1。若:f(x1)=0,则确定x1为f(x)的根;f(x1)*f(x2)0,则确定根x不在区间x1,x2内,设定x2,x2+1为下一个搜索区间;若确定根x在区间x1,x2内,采用二分法,将区间x1,x2分成左右两个子区间:左子区间x1,x和右子区间x,x2(其中x=(x1+x2)/2)。如果f(x1)*f(x)0,则确定根在左区间x1,x内,将x设为该区间的右界值(x2=x),继续对左区间进行对分;否则确定根在右区间x,x2内,将x设为该区间的左界值(x1=x),继续对右区间进行对分;上述对分过程一直进行到区间的间距满足精度要求为止(即x2-x10.005)。此时

4、确定x1为f(x)的根。$N+ x: a,b,c,d,x1,x2,xx:extended;function f(x:extended): f:=(a*x+b)*x+c)*x+d;end; read(a,b,c,d); for x:=-100 to 100 do x1:=x;x2:=x+1; if f(x1)=0 then write(x1:0:2, ) else if f(x1)*f(x2)=0.005 do xx:=(x1+x2)/2; if f(x1)*f(xx)a2ar;(2) 其中第i位数(1=ir-i;我们按以上原则先确定第一个数,再逐位生成所有的r个数,如果当前数符合要求,则添加下

5、一个数;否则返回到上一个数,改变上一个数的值再判断是否符合要求,如果符合要求,则继续添加下一个数,否则返回到上一个数,改变上一个数的值按此规则不断循环搜索,直到找出r个数的组合,这种求解方法就是回溯法。如果按以上方法生成了第i位数ai,下一步的的处理为:(1) 若air-i且i=r,则输出这r个数并改变ai的值:ai=ai-1;(2) 若air-i且ir,则继续生成下一位ai+1=ai-1;(3) 若air-1则重复:若air-i,若i=r,则输出解,并且ai:=ai-1;若ir,则继续生成下一位:ai+1:=i+1;若 air-i then 符合条件 if i=r then 输出for j:

6、=1 to r do write(aj:3);writeln; endelse 继续搜索begin ai+1:end else回溯 begin i: until a1=r-1;下面我们再通过另一个例子看看回溯在信息学奥赛中的应用。例2 数的划分(noip2001tg)问题描述 整数n分成k份,且每份不能为空,任意两份不能相同(不考虑顺序)。例如:n=7,k=3,下面三种分法被认为是相同的。1,1,5; 1,5,1; 5,1,1;问有多少种不同的分法。输入:n,k (6n=200,2=k=6)输出:一个整数,即不同的分法。样例 7 34 四种分法为:1,1,5; 1,2,4; 1,3,3; 2,

7、2,3;此题可以用回溯法求解,设自然数n拆分为a1,a2,ak,必须满足以下两个条件:(1) n=a1+a2+ak ;(2) a1=a2=ak (避免重复计算);现假设己求得的拆分数为a1,a2,ai,且都满足以上两个条件,设sum=n-a1-a2-ai,我们根据不同的情形进行处理:(1) 如果i=k,则得到一个解,则计数器t加1,并回溯到上一步,改变ai-1的值;(2) 如果i=ai,则添加下一个元素ai+1;(3) 如果ik且sumai,则说明达不到目标,回溯到上一步,改变ai-1的值;算法实现步骤如下:输入自然数n,k并初始化;t:=0;ai: sum:=n-1; nk:=n div k

8、;如果a1=ai则继续搜索;若sum=ai then 判断是否回溯begin inc(i);end继续搜 else begin dec(i);回溯 until a1nk; writeln(t);回溯法是通过尝试和纠正错误来寻找答案,是一种通用解题法,在NOIP中有许多涉及搜索问题的题目都可以用回溯法来求解递归算法算法 递归算法的定义:如果一个对象的描述中包含它本身,我们就称这个对象是递归的,这种用递归来描述的算法称为递归算法。我们先来看看大家熟知的一个的故事:从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事,他说上面的故事本身是

9、递归的,用递归算法描述:procedure bonze-tell-story; if 讲话被打断 then 故事结束从前有座山,山上有座庙,庙里有个老和尚在给小和尚讲故事;bonze-tell-story;end从上面的递归事例不难看出,递归算法存在的两个必要条件:(1) 必须有递归的终止条件;(2) 过程的描述中包含它本身;在设计递归算法中,如何将一个问题转化为递归的问题,是初学者面临的难题,下面我们通过分析汉诺塔问题,看看如何用递归算法来求解问题;例1:汉诺塔问题,如下图,有A、B、C三根柱子。A柱子上按从小到大的顺序堆放了N个盘子,现在要把全部盘子从A柱移动到C柱,移动过程中可以借助B柱

10、。移动时有如下要求:(1) 一次只能移动一个盘子;(2) 不允许把大盘放在小盘上边;(3) 盘子只能放在三根柱子上;当盘子比较多的时,问题比较复杂,所以我们先分析简单的情况:如果只有一个盘子,只需一步,直接把它从A柱移动到C柱;如果是二个盘子,共需要移动3步:(1) 把A柱上的小盘子移动到B柱;(2) 把A柱上的大盘子移动到C柱;(3) 把B柱上的大盘子移动到C柱;如果N比较大时,需要很多步才能完成,我们先考虑是否能把复杂的移动过程转化为简单的移动过程,如果要把A柱上最大的盘子移动到C柱上去,必须先把上面的N-1个盘子从A柱移动到B柱上暂存,按这种思路,就可以把N个盘子的移动过程分作3大步:(

11、1) 把A柱上面的N-1个盘子移动到B柱;(2) 把A柱上剩下的一个盘子移动到C柱;(3) 把B柱上面的N-1个盘子移动到C柱;其中N-1个盘子的移动过程又可按同样的方法分为三大步,这样就把移动过程转化为一个递归的过程,直到最后只剩下一个盘子,按照移动一个盘子的方法移动,递归结束。递归过程:procedure Hanoi(N,A,B,C:);以B柱为中转柱将N个盘子从A柱移动到C柱 if N=1 then write(A,-,C)把盘子直接从A移动到Celse begin Hanoi(N-1,A,C,B); 以C柱为中转柱将N-1个盘子从A柱移动到B柱 write(A,-,C);把剩下的一个盘

12、子从A移动到C Hanoi(N-1,B,A,C); 以A柱为中转柱将N-1个盘子从B柱移动到C柱从上面的例子我们可以看出,在使用递归算法时,首先弄清楚简单情况下的解法,然后弄清楚如何把复杂情况归纳为更简单的情况。在信息学奥赛中有的问题的结构或所处理的数据本身是递归定义的,这样的问题非常适合用递归算法来求解,对于这类问题,我们把它分解为具有相同性质的若干个子问题,如果子问题解决了,原问题也就解决了。例2求先序排列 (NOIP2001pj)问题描述给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度8)。样例 输入:BADC BDCA 输出:ABCD我们先看看三

13、种遍历的定义:先序遍历是先访问根结点,再遍历左子树,最后遍历右子树;中序遍历是先遍历左子树,再访问根结点,最后遍历右子树;后序遍历是先遍历左子树,再遍历右子树,最后访问根结点;从遍历的定义可知,后序排列的最后一个字符即为这棵树的根节点;在中序排列中,根结点前面的为其左子树,根结点后面的为其右子树;我们可以由后序排列求得根结点,再由根结点在中序排列的位置确定左子树和右子树,把左子树和右子树各看作一个单独的树。这样,就把一棵树分解为具有相同性质的二棵子树,一直递归下去,当分解的子树为空时,递归结束,在递归过程中,按先序遍历的规则输出求得的各个根结点,输出的结果即为原问题的解。源程序program

14、noip2001_3;varz,h : string;procedure make(z,h:string); z为中序排列,h为后序排列vars,m : integer;begin =length(h);m为树的长度write(hm); 输出根节点s:=pos(hm,z); 求根节点在中序排列中的位置if s1 then make(copy(z,1,s-1),copy(h,1,s-1); 处理左子树if ms then make(copy(z,s+1,m-s),copy(h,s,m-s); 处理右子树readln(z);readln(h);make(z,h);递归算法不仅仅是用于求解递归描述的

15、问题,在其它很多问题中也可以用到递归思想,如回溯法、分治法、动态规划法等算法中都可以使用递归思想来实现,从而使编写的程序更加简洁。比如上期回溯法所讲的例2数的划分问题,若用递归来求解,程序非常短小且效率很高,源程序如下 n,k: tol:procedure make(sum,t,d:integer);var i: if d=k then inc(tol) else for i:=t to sum div 2 do make(sum-i,i,d+1);tol: make(n,1,1); writeln(tol);有些问题本身是递归定义的,但它并不适合用递归算法来求解,如斐波那契(Fibonacc

16、i)数列,它的递归定义为:F(n)=1 (n=1,2)F(n)=F(n-2)+F(n-1) (n2)用递归过程描述为:Funtion fb(n:integer):Begin if n(2,3)-(4,4),若不存在路径,则输出no我们以44的棋盘为例进行分析,用树形结构表示马走的所有过程(如下图),求从起点到终点的路径,实际上就是从根结点开始深度优先搜索这棵树。马从(1,1)开始, 按深度优先搜索法,走一步到达(2,3),判断是否到达终点,若没有,则继续往前走,再走一步到达(4,4),然后判断是否到达终点,若到达则退出,搜索过程结束。为了减少搜索次数,在马走的过程中,判断下一步所走的位置是否在

17、棋盘上,如果不在棋盘上,则另选一条路径再走。const dx:array1.4of integer=(2,2,1,1); dy:array1.4of integer=(1,-1,2,-2);type map=record x,y: i,n,m:array0.50of map;procedure dfs(i:var j:=1 to 4 doif (ai-1.x+dxj0)and(ai-1.x+dxj0)and(ai-1.y+dyj,aj.x,aj.y, halt;输出结果并退出程序 dfs(i+1);搜索下一步ai.y:出栈 a1.x:a1.y: readln(n,m); dfs(2); writeln(no从上面的例子我们可以看出,深度优先搜索算法有两个特点:1、己产生的结点按深度排序,深度大的结点先得到扩展,即先产生它的子结点。2、深度大的结点是后产生的,但先得到扩展,即“后产生先扩展”,与栈的工作原理相同,因此用堆栈作为该算法的主要数据结构,存储产生的结点。对于不同的问题,深度优先搜索算法基本上是一样的,但在具体处理方法和编

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1