备战NOIP2010提高组初赛复习——算法篇之算法设计常用策略.doc

备战NOIP2010提高组初赛复习——算法篇之算法设计常用策略.doc

  1. 1、本文档共71页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
备战NOIP2010提高组初赛复习 ——算法篇之算法设计的常用策略 程序设计主要包括两个方面 结构特性的设计(数据结构的设计); 行为特性的设计(算法设计); 第一篇主要阐述了结构特性的设计,即如何为解题选择合适的数据结构。但这只是问题的一个方面。接下来的问题是如何将解题过程的每一个细节准确地加以定义,并用某种语言完整地描述出来。这一过程既所谓行为特性的设计,亦称算法设计。第二篇将围绕这个主题展开讨论。 算法是一组(有限个)规则,,,,,: (1)有穷性 一个算法必须保证执行有限步之后结束; (2) 算法的每一步骤必须确切定义; (3) 一个算法有0个或多个输入,0个输入是 指算法本身定出了初始条件; (4) 一个算法有一个或多个输出, 的算法是毫无意义的; (5) 算法原则上能够精确地进行,; ,,, 现实世界的事物多姿多彩,千变万化。我们不可能规定一些简单的条条框框和套用现成的模式去解决所有的问题。然而,现实世界也有大量事物存在着许多相似或相近的规律,存在本质相同的东西。正因为如此,就有可能形成一些常用的方法思路(策略),按照这些方法思路分析和求解试题,一般可使解题过程变得容易一些。 本章将介绍几种典型的算法策略,这些策略常用于那些需要独立思考、见解独创和有所创新的非标准题。当然面对实际试题,究竟使用哪种方法,怎样用,需要“具体问题具体分析”,需要机智灵活,不宜死记成规、生搬硬套,得靠自己想方设法。所谓“阵而后战,兵法之常,运用之妙,存乎一心”是也。 §5.1 将问题A对应另一个便于思考或有求解方法的问题B,化繁为简,变未知为已知。 一 一对应技术是一种重要的策略。它的思维核心是求同,通过举一反三、触类旁通地对已经解决的类似问题和有关事实作联想,外推出事物间的联系,从而全面、深入地认识和分析事物。“世界上没有完全不同的东西”,相似点的普遍存在为我们使用对应策略解题提供了基础。但是对应并不等于等价,它不仅要分析问题间的共同点,还要分析问题间的不同点,是一种异中求同的思维方法。 一、对应精典问题 “客观世界物质第一性,思维第二性”。经典问题及其算法的知识积累是解题的基础。竞赛的许多试题最终都可以转化为经典问题,因此必须尽可能多地掌握经典问题及其算法的知识。解题时,心中经常要回忆已经解决的经典问题和有关解法,往往会收到意想不到的效果。当然这些试题并不直接以经典问题的原貌出现。我们必须合理运用求同思维、求异思维比较两者间的相同点和不同点,通过适当的方法将试题转化为经典问题。 【例题廿】换车问题 一个城市有n个车站,已知m条连接这些车站的公共汽车单向路线。求站1至站n的最少换车数。 输入: n m 以下m行依次列出每条线路的车站序号。 输出: 最少换车次数。 算法分析 这个问题对我们来讲并非陌生。如果将问题要求改为“求站1到站n最少经过多少站”,就变为我们相当熟悉的最短路径的典型应用。即 令有向图G=V,E,V|=n。vi,vjV且(Vi,Vj)E当且仅当i站、j站在某条线路上相邻,(Vi,Vj)ij设为1。显然,汽车线路经过的站数=路径顶点数=路径边数+1=路径的权和+1。为使总站数最少,只要使路径的权和最小,即只要求出图G中Vi至Vj的最短路径即可。 但现在的问题是求最少换车次数,虽然它与求经过最少站数的总是有共同背景,但要求不同。我们化异为同,重新对原图G作了修正: 若Vi,VjV且(Vi,Vj)∈E当且仅当站i与站j依次在同一条公共汽车线路上(Vi可直达Vj),Wij仍为1。然后运用求最短路径方法计算V1至Vn的最短路径长度,其长度-1即为最少换车次数。设 t—当前线路的车站数; oneline—当前线路的车站序列; g—有向图的相邻矩阵; 我们按照下述算法计算最少换车次数: fillchar (g, sizeof (g),0); {有向图初始化} for i:=1 to m do {读入每条线路的信息,构造g图} begin t←0; fillchar(oneline,sizeof(oneline),0); {第i条线路初始化} while not eoln do begin t←t+1;i条线路的第t个车站序号oneline[t]; for j:=1 to t-1 do g[oneline[j],oneline[t]]1;

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档