《算法艺术与信息学竞赛》课件1.2 基本算法.ppt

《算法艺术与信息学竞赛》课件1.2 基本算法.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《算法艺术与信息学竞赛》 刘汝佳 黄亮 著 1.2 基本算法 版权说明 本系列课件为刘汝佳、黄亮著《算法艺术与信息学竞赛》配套课件 凡是购买《算法艺术与信息学竞赛》的读者,均可免费获得此课件,供自己学习 此课件不得用于商业用途,若要用于教育用途,请自觉与作者联系,以获得支持 使用说明 ★符号表示重点要求 △符号表示只需要了解,不用深入学习 第1章 算法与数据结构 1.1 编程的灵魂——数据结构+算法=程序 1.2 基本算法 1.3 数据结构(1)——入门 1.4 数据结构(2)——拓宽与应用举例 1.5 动态规划 1.6 状态空间搜索 目录 一、枚举 二、贪心法 三、递归与分治法 四、递推 五、其他方法 六、总结 一、枚举 枚举法 不同的问题 判定问题:是否存在一个解? 计数问题:一共有多少个解? 优化问题:哪个解最好? 共同的思想:尝试所有可能的元素 核心:确定并枚举所有可能解的集合 枚举量 常见的枚举量大小 简单元素集合i: n种 二元组(i, j):n2种 元素排列(a1,a2,…an):n!种 n位k进制编码an-1an-2…a0:kn种 某n阶集合的子集:2n种 枚举的关键:减小枚举量 手段:避免不必要的枚举, 枚举方式 可能的方式 编码法:建立数与可能解的一一对应关系 后继法:取第一个可能解和后继可能解(或报告不存在) 递归法:隐式构造解的生成方式 建议:掌握前两种方法,但使用第三种 枚举和其他算法的结合 枚举问题的一部分,调用其他算法求解剩余部分 枚举算法的参数,调用多次此算法 售票员(原书习题1.2.4) 叶卡特琳堡有很多公共汽车,因此也有很多市民当上了售票员。如果在所有的市民中,售票员的人数超过P%而不到Q%,那么叶卡特琳堡至少有多少市民呢? 例如,如果P=13而Q=14.1,那么至少有15个市民 盒子里的气球(原书例题) 在一个长方体盒子里,有N(N≤6)个点。在其中任何一个点上放一个很小的气球,那么这个气球会一直膨胀,直到接触到其他气球或者盒子的边界。必须等一个气球扩展完毕才能放下一个气球。按照怎样的顺序在这N个点上放置气球,才使放置完毕后所有气球占据的总体积最大? 《盒子里的气球》分析 气球的数目很少 枚举所有放置气球的放法,即枚举长度为N的排列 对每种放置方法,进行几何计算,计算出总体积 时间复杂度:O(N!) 还有更好的算法吗? 翻硬币(原书习题1.2.5) 考虑一个翻硬币游戏。有N(N≤10 000)行硬币,每行有9个硬币,排成一个N×9的方阵,有的硬币正面朝上,有的反面朝上。我们每次可以把一整行或者一整列的所有硬币翻过来,请问怎么翻,使得正面朝上的硬币尽量多。 《翻硬币》分析 考虑到列数很少,而行数很多 如果确定每列(或行)是否翻转后,那么,对于每行(或列)即可进行贪心 枚举每列的硬币是否翻转 确定每列硬币翻转情况后,对每行进行贪心 时间复杂度:O(29×N) 离散函数(原书习题1.2.6) 有一个离散函数,定义在集合{1,2,3,…, N},取值在-232…232。请找出函数图像上两个点,使得函数在这两点之间的点都在两点连线的下方,且此连线的斜率尽量大。N≤10 000 《离散函数》分析 方法一:单纯的枚举 枚举每两点对,判断是否两点间的点都此两点的连线下方,计算斜率,找出最佳点对 时间复杂度:O(N2) 方法二:改进后的枚举 对方法一进行改进,是否可以从某种角度,找出突破点,减少枚举量呢? 从数学角度入手,发现只有两点相邻,斜率能取得最大值,这样,只枚举相邻点即可 时间复杂度:O(N) 奇妙的数(补充题目) 给定n, m,寻找m位n进制数A,使得2A,3A,…mA的数字均为A数字的排列 如m=6, n=10时,142,857是唯一解 给定数据最多只有一组解,也可能无解(如m=6, n=100时) 超长数字串(原书习题1.2.7) 给一个数字串S:1234567891011121314151617181920… 它是由所有自然数从小到大依次排列起来的。任意给一个数字串S1,容易知道它一定在S中出现无穷多次。编程求出它第一次出现的位置。例如对于串“81”,它最先出现在位置27。 塞子难题(补充题目) 塞子有两部分组成 两部分高度均固定 有两种放置方向 一共有三个塞子 放一个三角形里面 可以实现吗? 二、贪心 贪心法 不同问题中的贪心 多阶段决策:每步选择让下一步尽量好的方法 约束满足:每次选择最有可能得到解的方式给变量赋值 子集优化:每次选择权最小的元素加入集合 多阶段决策问题通常考虑用动态规划 约束满足问题通常考虑用回溯法 对于特殊的问题,贪心法是正确的 例:子集优化问题 把一个二元组(E, I)叫做一个子集系统,如果: E是一个非空集合 I是E的一个子集族,它在包含运算下封闭,即I的每

文档评论(0)

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

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

1亿VIP精品文档

相关文档