网站大量收购闲置独家精品文档,联系QQ:2885784924

最长的不下降子序列n log n.ppt

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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;

文档评论(0)

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

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

1亿VIP精品文档

相关文档