试题选讲.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
试题选讲

试题选讲 姚金宇 在一个果园里,有n堆果子,每堆果子有一个重量值。现在要把所有的果子合并成一堆。 每一次合并,可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量和。可以看出,经过n-1次合并之后,就只剩下一堆了。在合并果子时总共消耗的体力等于每次合并所耗体力之和。 现在请你设计一种合并的次序方案,使得总共消耗的体力之和最少。 例如,有3堆果子,重量依次为1,2,9。可以先将1、2堆合并,新堆重量为3,消耗体力为3。接着将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以总共耗费体力=3+12=15。可以证明15为最小体力值。 数据范围:n=30000 本题就是数据结构中的最优二叉树(哈夫曼树)的应用。 将每个初始果子堆看成叶子节点,堆的重量作为叶子节点的权,每个堆被合并的次数就是该节点的带权路径长度。 树中的每个非叶子节点对应了一次合并。 例如,三堆果子重量分别是1,2,9。一种合并的过程是1和2合并,然后和9合并。对应的哈夫曼树如下: 套用构造哈夫曼树的算法,我们得到该问题的解决办法。 每次选当前重量最小的堆进行合并,合并后的重量等于合并的两堆的重量之和。(思考:正确性证明?) 用二叉堆维护当前的果子堆,每次从堆中取出最小的两个元素,并且插入新元素,每一个步骤的时间复杂度都是O(log2n). 要进行n-1次合并,所以总的时间复杂度是O(nlog2n) 问题描述:有n堆石子排成一排,每次可以合并相邻的两堆石子,直至合并成一堆。合并的代价是两堆石子的重量之和。总代价是n-1次合并的代价和。求使总代价最小的合并方案。 与原问题的相同点:合并方法相同、代价计算方法相同。 与原问题的不同点:原问题可以任意合并、该问题只能合并相邻堆。 本题我们采用动态规划方法。 设 f(i,j)表示将从第i堆到第j堆的石子合并为一堆所需最小代价。 s(i,j)表示从第i堆到第j堆的石子总重量。 规划方程: f(i, j)=min{f(i, k)+f(k+1, j) | k=i..(j-1) }+s(i,j) 边界 f(i, i)=s(i,i) 该算法的时间复杂度为O(n3) 石子合并问题是一个经典问题,可以运用四边形不等式和决策单调性优化到O(n2);还有O(nlog2n)的算法,具体请参阅相关资料。 思考:本题使用动态规划的原始动机是什么? 将原题的条件改为:每一次合并,可以任选最多k堆进行合并,合并一次的代价就是这若干堆果子的重量之和。 一种贪心的思想是: 第一次选取最小的(n-2)mod(k-1)+2堆合并,以后每次都选取最小的k堆合并。(思考:这样做的理由是什么?) 仍然用堆维护,算法的复杂度O(nlog2n) 通过分析NOIP2004的一道试题,挖掘出题目内涵的数据结构的实质,并很好的解决问题。 我们分别通过修改某些条件,得到两个扩展的问题。石子合并问题题面与原题类似,但解法与原题几乎没有共同点;最优k叉树问题是运用与原题的类似解法解决的。 题目一 Josephus问题 编号为1到N的N个人围成一圈,从第一个人开始,1、2报数,报2的人出圈,直至圈中只剩下一个人。 求最后剩下的人的编号。 例如N=5时,出圈的顺序是2,4,1,5,最后剩下的人是3。 题目一 Josephus问题 一般约瑟夫问题的解法:线性表模拟。时间复杂度O(nm) 本题的特殊性:m=2 第一圈报完数后,编号为偶数的人就全部出圈了。此时圈中剩下[n/2]个人。 若n是偶数,此时又从编号为1的人开始报1; 若n是奇数,编号为1的人出圈,从编号为3的人开始报1。 第二圈与第一圈有类似性!如何利用? 题目一 Josephus问题 题目一 Josephus问题 设f(i)表示编号为1到i的i个人围成一圈报数,最后剩下的人的编号。 f(1)=1 f(2k)=2*f(k)-1 f(2k+1)=2*f(k)+1 所求答案:f(n) 算法的时间复杂度O(log2n) 题目二 逆序对 N个元素的整数序列A1,A2,……,An。若Ai,Aj满足ij且AiAj则我们称(Ai,Aj)为一个逆序对。 求序列中所有逆序对的个数。 归并排序算法回顾。 本题的大体思想:分治——在归并排序的基础上求逆序对个数。 题目二 逆序对 算法框架: Ans=calc(1, n) Func calc(s, t):integer; //该函数对序列As-At进行排序并且求其中逆序对个数。 [ tot=calc(s, (s+t)/2) tot=tot+calc((s+t)/2+1, t) tot=tot+get(s, t

文档评论(0)

woai118doc + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档