ACM基础算法入门.ppt

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ACM基础算法入门

ACM基础算法入门 .基础动态规划 .基础的“穷竭搜索” .贪心的三种区间问题 .数论那些事 .二分的另类法 引言 算法简单但思想及其重要 介绍的算法都堪称为经典中的经典 基础动态规划 多阶段决策过程最优化的数学方法 三要素: -阶段 -决策 -状态 动态规划的适用范围 最优子结构(最优化原理) 当前状态依赖于前面的状态得到,是前面状态的完美总结 无后效性(不成环) 经典模型 数塔模型 背包问题 区间最大和模型 最长非降子序列模型 最长公共子序列 数字归并(区间dp) 旅行商问题(状态压缩) 求解从顶到下经过节点的最大值是多少 解题思路 列状态 v [ I ] [ j ]表示走到第i层的第j个节点的最大值 分阶段 每一个层就是一个阶段 状态转移方程(决策) V [ i-1 ] [ j ] += V [ I ] [ j ] v [ I ] [ j + 1 ] ? V [ I ] [ j ] : v [ I ] [ j + 1 ]; 单调递增非降子序列 给定一整型数列{a1,a2...,an}(0n=100000),找出单调递增最长子序列,并求出其长度。 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。 解题思路 定义状态 dp【i】以i为结束节点最长单调子序列长度 阶段 每一个点选择过程即阶段 转移方程: Dp【i】= max(dp【1~(i-1)】) + 1 想想有没有更好的方法??? dp总结 模型匹配法 三要素法 先确定阶段(数塔问题) 先确定状态(一般题目都是) 先确定决策(背包问题) 贪心的三种区间问题 选择不相交区间 区间选点 区间覆盖 选择不相交区间 数轴上有n个开区间(ai,bi),选择尽量多个区间, 使得这些区间两两没有公共点。 会场安排问题 先对n个区间按照bi从小到大的顺序排序,如果 bi相同,则ai按照从大到小的顺序排序。然后从前往后 扫描每个区间,找出所有的符合条件的区间。 注意:排序后第一个区间一定会选,因为它的bi最小, 它不影响后面区间的选取,而且如果不选此区间,最终 求出的区间数目会变少。 区间选点问题 数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个 区间内都至少有一个点(不同区间内含的点可以是同一个)。 解题思路 根据刚才的讨论,所有需要考虑的区间的a也是递增的, 我们把它画成上图的形式。如果第一个区间不选最后一个点, 而是去中间的,如灰色点,那么把它移动到最后一个点后, 被满足的区间增加了,而且原先被满足的区间现在一定被满 足。这样才能保证选取的点最少。 区间覆盖问题 数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖 一条指定线段[s, t]。 解题思路 把各区间按照a从小到大顺序。如果区间1的起点不是s, 则无解,即[s,t]无法被完全覆盖(因为其他区间的起点更大, 不可能覆盖到s点),否则选择起点在s的最长区间。选择此 区间[ai,bi]后,新的起点应该被设置为bi,并且忽略所有区间在 bi之前的部分,就像预处理一样。虽然贪心策略比上面的题 复杂,但是仍然只需要一次扫描。如下图5所示。s为当前有 效起点(此前部分已被覆盖),则应该选择区间2。 深度优先搜索 深度优先搜索(DFS,Depth-First Search)是搜索的手段之一。 它从某个状态开始,不断地转移状态直到无法转移,然后回退到前一步的状态,继续转移到其他状态,如此不断重复,直至找到最终的解。 根据深度优先搜索的特点,采用递归函数实现比较简单。 例题 给定整数 a1,a2,a3,......,an, 判断是否可以从中选出若干个数,使他们的和恰好为k。 限制条件: 1=n20 -10^8=ai=10^8 -10^8=k=10^8 输入: 4 1,2,4,7 13 输出: Yes 解题过程 宽度优先搜索 例题: 水池数目 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。 输入m行每行输入n个数,表示此处有水还是没水 (1表示此处是水池,0表示此处是地面) 0m100 0n100 输入: 3 4 1 0 0 0 0 0 1 1 1 1 1 0 输出: 2 解题过程 本题是简单的搜索问题,采用深度优先遍历可以解决,根据题目要求,假设从任意一点值为1的出发,将这点的坐标上下左右全部用0替换,1次DFS后与初始动这个1连接的1全部被替换成0,因此,直到

文档评论(0)

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

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

1亿VIP精品文档

相关文档