LIS问题的优化

普通的LIS问题的时间复杂度是O(n2),瓶颈主要是在方程f[i]=1+max(f[j]),其中1jia[j]<a[i]中寻找j

我们尝试用贪心优化,这里的j就是小于i的比a[i]小的且f[j]最大的j

根据贪心原则,假设当前循环到了i(还没有开始处理),我们用h[k]表示f[j]ka[j]最小的a[j]1ji

假设当前循环到了i,此前的最优长度为len

那么如果a[i]>h[len],那么就可以len++,h[len]=a[i]

否则的话,我们可以发现h是单调的(为什么见下),于是我们二分,找到一个位置l,满足l是最大的且h[l]<a[i],然后就有f[i]=l+1,再考虑修改,肯定就是h[l+1]=min(h[l+1],a[i]),此时修改后h仍然是单调的,所以h一直都是单调的

当然上述方法有一定思维含量,我们可以利用数据结构来减少思维含量

我们将a离散化,设h[k]表示值为k(离散化后)的最大的f,我们查找区间[1,a[i]1]的最大值就好了

posted @   最爱丁珰  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示