从《小H的小屋》的解法谈算法的优化 .ppt

从《小H的小屋》的解法谈算法的优化 .ppt

  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文档。上传文档
查看更多
从《小H的小屋》的解法谈算法的优化 安徽师范大学附属中学 杨弋 题目大意 小H有一个院子,东西方向长为100单位。东墙和西墙均平行于y轴,北墙和南墙分别是斜率为k1和k2的直线。北墙和南墙分别围有多块草坪,每块草坪都是一个矩形,矩形的每条边都平行于坐标轴。相邻两块草坪的接触点恰好在墙上,接触点的横坐标被称为它所在墙的“分点”,这些分点必须是1到99的整数。北墙要有m块草坪,南墙要有n块草坪,并约定,m≤n。如果记北墙和南墙的分点集合分别为X1,X2,则应满足X1 X2。 输入k1,k2,m,n。k1和k2为正实数,m和n为正整数,且2≤m≤n≤100。 假定南北墙距离很远,南墙草坪和北墙草坪不会重叠。 题目大意 让我们来看一个例子: 输入:0.5 0.2 2 4 算法一 看到题目,我们首先想到的算法是动态规划。 我们用f(w,u,v)表示长度为w,北墙u块草坪和南墙v块草坪时的最小面积。 令 一块北墙草坪和其对应的南墙草坪为一个“块”,若北墙草坪长度为x,南墙草坪块数为k,则该块最小面积为area(x,k)。 算法一 算法一 算法二 算法二 我们枚举x,当x增大的时候,ka不会减小。 这样,我们可以枚举x的同时计算ka 。 算法二 算法三 算法三 算法三 算法三 算法三 算法三 算法三 我们先把整个墙分成两部分,第一部分包含m1段北墙草坪,每段对应n1段南墙草坪;第二部分包含m2段北墙草坪,每段对应n2段南墙草坪。如果两部分的长度确定了,在两部分内,都可以直接贪心求该部分的最小面积 。 我们枚举其中一个部分的长度,另一个部分的总长度也就确定了 ,此时的最优解可以在O(1)时间内计算出来。 算法三 算法四 算法四 算法四 算法四 算法四 总结 总结 总结 * * 图中给出的就是这组数据的最优解,最小面积为3000。 y x 西 东 南 北 0 25 50 75 100 f(w,u,v) =min{f(w-x,u-1,v-k)+area(x,k) } x 共k块 …… …… 这样,我们就得到了算法一: 1、枚举所有合法的w,u,v,对于每一组w,u,v,计算f(w,u,v) 。 2、在计算f(w,u,v)时,枚举所有合法的x,k,从而求出f(w,u,v) 。 3、 f(100,m,n)就是我们所要求的解。 该算法时间复杂度是O(l2mn2) 空间复杂度是O(ln) 看来,我们必须优化我们的算法…… 在状态转移时,假如我们已经确定了x…… k f(w,u,v) ka kka时曲线是下降的 kkb时曲线是上升的 kb 由于x和ka都是递增的,该算法的时间复杂度降为O(l2mn),空间复杂度仍然是O(ln)。 我们注意到计算f(w,u,v)的最优解所用的x,k必不小于计算f(w,u+1,v)的最优解所用的x,k (假如f(w,u+1,v)存在的话),所以我们可以记录计算最优解时用的x,k,从而进一步减少程序运行所用时间。 算法二无论在时间复杂度上还是在空间复杂度上都足够应付这道题目的所有数据了。 那么,究竟有没有更好的方法呢? 现在让我们彻底抛弃动态规划的思想,来试一试贪心算法在此题中的应用。 100Hil 50 50 25 25 50 北墙草坪 南墙草坪 k1=k2=1,m=2,n=3 我们尽可能平均地分配北墙草坪的长度 然后再尽可能平均地为南墙草坪分配长度 S=8750 50 50 25 25 50 100Hil 57 43 29 28 43 北墙草坪 南墙草坪 k1=k2=1,m=2,n=3 但是…… S=8572 这样的贪心算法是错误的! 为什么说这个贪心算法是错误的? 因为每一块北墙草坪对应的南墙草坪数量并不是相等的! 如果我们能使每一块北墙草坪对应的南墙草坪数量相等…… 显然,这时尽量平均分配得到的就是最优解了 北墙草坪 南墙草坪 现在我们假设最优解有这样的情况 北墙草坪对应的南墙草坪块数的差距大于1了。 那么…… 总存在这样的调整,调整以后差距会小于等于1,并且总面积不会比原来大。 我们可以把南墙草坪按块数尽可能平均地分配给北墙草坪! 这里是一个例子 我们有3块北墙草坪和10块南墙草坪,该怎么分配呢? 于是,我们得到了一个全新的算法: 就像这样: 这样,整个算法的时间复杂度是O(l-n)的,空间复杂度是O(1)的。 我们的优化还没有结束! 现在让我们来看看算法四吧 我们设分给第一部分的东西向长度为i 。设能使S取到最优解的最小i为i1,能使S取到最优解的最大i为i2。 和我们在思考算法二时的情况类似,我们发现ii1时S随i增大而减小,ii2时S随i增大而增大,在i1≤i≤i2时S始终能取到最小值。 就像这样 i S i1 ii1时曲线是

文档评论(0)

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

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

1亿VIP精品文档

相关文档