- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
学习札记 当一些简单问题的规模扩大之后…… 石子归并 有n堆石子排成一条直线,每堆石子有一定的重量。现在要合并这些石子成为一堆石子,但是每次只能合并相邻的两堆。每次合并需要消耗一定的体力,该体力为所合并的两堆石子的重量之和。问最少需要多少体力才能将n堆石子合并成一堆石子? 数据规模:n =3000 石子归并 这个问题的一个解法是动态规划。 f[i,j]:=min(f[i,v]+f[v+1,j]+sum[i,j]) i j,i =v j 初始化时f[i,i]:=0; sum[i,j]表示第i个数到第j个数的和,这个可以在O(1)时间内解决。 不难发现这个算法的复杂度是n^3.n的范围是3000,需要优化算法。 石子归并 对于动态规划的优化和搜索的优化是一样的道理。搜索中,如果某状态下不会有最优解,那么就不用继续搜索下去了。动态规划也可以这样来优化。 具体方法是:在计算每个状态的值的时候,记录下它所选取的分界点v,用s[i,j]表示当f[i,j]取最优值的时候,选取的v值。那么原状态转移方程中的v的枚举范围便可以从原来的(i,j-1)变为(s[i,j-1],s[i+1,j]) 石子归并 这样,我们便得到了一个时间效率和n^2等同的算法。 这种优化思想叫做四边形不等式优化,在很多问题中都有广泛的运用。 参考文献:陈颖《动态规划的优化》 约瑟夫问题 有n个人围成一圈。现在从第一个人开始报数,报到m的人出圈,然后再从下一个人开始重新报数……直到只剩下一个人为止。请问这个人的编号是多少。 数据规模:n =100000,m =maxlongint 约瑟夫问题 直接模拟这一题,很简单地可以得出一个n^2的算法。 做n-1次循环,每次循环中需要移动一次数组。所以整个算法是n^2的。 数据给出n =100000,这个算法显然需要优化。 但是模拟很难实现O(n)或者O(nlogn)。 约瑟夫问题 思路1:找规律。 这一题几乎无规律可寻。 思路2:递推。 记f[n]为n个人的圈中出圈的那个人的编号。那么仔细考虑一下可以发现,n个人的圈第一次出圈的肯定是编号为((n-1) mod m+1)的那个人。那么接下来是一个长度为n-1的圈,和单独的n-1的人报数的不同点是起始位置不同,有一些人的编号不同。所以可以用递推。复杂度O(n). 约瑟夫问题 实际操作的时候f数组可以省下。 leave:=1; for i:=2 to n do begin j:=((m-1) mod i+leave-1) mod (i-1)+1; if j =(m-1) mod i+1 then leave:=j+1 else leave:=j; end; 导弹拦截 有n颗导弹,一套导弹拦截系统,这套拦截系统的缺点是每发一炮之后,下一炮发的高度不能高于这一炮发的高度,但第一炮可以是任意高度。给出这n颗导弹飞来的顺序,求出这套系统最多能打掉多少颗导弹。 数据规模:n =100000 导弹拦截 Noip的导弹拦截问题其实是求一个最长不上升序列。 如果将序列反过来,则是一个最长不下降子序列问题,称为LST。 先来看看一般的解法: For i:=2 to n do for j:=i-1 downto 1 do if high[i] high[j] then f[i]:=max(f[i],f[j]+1); 导弹拦截 算法复杂度n^2,显然是要超时的。 优化: 还是从动态规划的基本优化思路着手,也就是去除一些一定不会有最优解产生的状态。例如:f[i]=3; high[i]=10; f[j]=3; high[j]=5,那么无论具体的搭配情况如何,状态j都要比状态i优秀。也就是说,我们只需要保留下当前长度为i的序列中最后一个数字的大小即可,且这个数字要尽量地小。 导弹拦截 由此,算法的本质也发生了变化。 F[i]表示长度为i的序列最后一个数字是多少,且这个数字要尽量地小。 初始化:f[0]:=0; f[i]:=maxlongint; 发现一个性质,f数组一定是不下降序列。 证明:假设i j f[i] f[j] 那么把第f[i]换成f[j]状态中的第j-1个元素的值一定更优秀。所以f[i]一定小于等于f[j]。 导弹拦截 对于当前需要处理的第i个元素,在f[i]中查找high[i]的位置(二分查找)。假设high[i]处于f[a]和f[b]之间,那么令f[b]=high[i]即可。 在插入high[i]的过程中,可以顺便保留下最长不下降序列的长度。 算法复杂度nlogn. 最优排列匹配问题 有很多的问题都可以抽象出同一种形式:在n个元素的全排列中寻找一种让某个值达到最优的排列。 例如: Oibh练习赛中的《 文明III》《线型网络》 求harmilto
您可能关注的文档
最近下载
- 计算机兴趣小组活动计划.docx VIP
- 人民币实际有效汇率波动对天津市贸易收支影响的实证研究的中期报告.docx VIP
- 中国石狮子PPT课件.pptx VIP
- 2025年全国高考(新课标)化学真题卷含答案解析 .pdf VIP
- 新部编小学语文五年级上册看拼音写词语.docx VIP
- 人教版(2025)必修第三册Unit 1 Festivals and celebrations Discovering Useful Structures 课件(共46张PPT)(含音频+视频).pptx VIP
- 年产2500吨高端氟材料项目环评报告表.pdf VIP
- 临床微生物室标准操作程序SOP.pdf VIP
- Boss Roland逻兰RC-600 乐句循环工作站RC-600 中文用户手册 说明书.pdf
- 2025年秋季湖北武汉市华中师范大学校友工作办公室学生助理招聘笔试历年典型考题(历年真题考点)解题思路附带答案详解(5套).docx VIP
文档评论(0)