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

最长不下降子序列 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[

文档评论(0)

1亿VIP精品文档

相关文档