- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最长的不下降子序列n log n
最长不下降子序列 O(NlogN)算法 ——by yl O(N ) 先看普通思路 for i:=1 to n do begin f[i]:=1; for j:=1 to i-1 do if(a[j]=a[i])and(f[j]+1f[i]) then f[i]:=f[j]+1; ans:=max(ans,f[i]); end; 2 先来说一说思路: 在枚举i时,找到在i之前的一个数j 使得a[j]=a[i] 并且使f[j]+1最大 O(N ) 2 换一种思路 设t[i]为 在数值为i的数中(以i结尾的) 最长的一段不下降子序列的长度 那么t[i]=max{f[j]}(a[j]=i) 所以对于一个i 可以快速知道f[i] 即 f[i]=max(t[j])+1 (1=j=a[i]) 换一种思路 那么我们可以得到以下程序 for i:=1 to n do begin for j:=1 to a[i] do if(t[j]+1f[i]) then f[i]:=t[j]+1; t[a[i]]:=max(t[a[i]],f[i])//更新 ans:=max(ans,f[i]); end; 看出这个程序仍然是O(N )的! 2 优化 在这个程序当中,我们可以看出 查询是O(N)的,而更新则是O(1)的 有平衡一点的方法吗? 树状数组! 优化 我们可以看出每次查找的只是1~a[i]的数 更新只更新一个数 更新的这个数对(a[i]~maxn)都有影响 我们可以用树状数组优化这两个操作 优化 for i:=1 to n do begin f[i]:=find(a[i])+1; //查找a[i]之前的最大数 change(a[i],f[i]); //更改a[i]以后的数 end. 优化 change(x,data) while(xMaxn)do begin if(datat[x]) then t[x]:=data; inc(x,x and -x); end; find(x) ret:=0; while(x0)do begin if(t[x]ret) then ret:=t[x]; dec(x,x and -x); end;
您可能关注的文档
最近下载
- Roland罗兰乐器JUNO-Gi 带数字录音功能的便携合成器JUNO-Gi Workshop 04 Realtime Control in the JUNO-Gi支持文档.pdf
- 天正变频器TVFS9说明书.pptx VIP
- 人教版小学三年级上册语文期末.docx VIP
- SW7203数据手册_V13926596180高效率双向升降压.pdf VIP
- GB50070-2024-矿山电力设计规范.doc
- 学前教育_农村幼儿园户外游戏活动现状的调查研究.docx VIP
- 国开农村经济管理形考作业1-4试题及答案.pdf
- 嵌入式系统基础与实践基于ARMCortex-M3内核的STM32微控制器习题答案.pdf
- 学前教育_传统文化在幼儿园环境创设中应用现状调查.docx VIP
- 2024-2025学年人教版数学三年级上册期末测试卷.pdf VIP
文档评论(0)