acwing 299. 裁剪序列

原题

考虑朴素dp,设dpi表示前i个数划分后的最小答案

可以得到转移:

dpi=minj=1i1{dpj+maxk=j+1i{ak}}

计算复杂度O(n2),会超时

我们发现对于可能成为答案的状态是以下条件的一个

  1. k=jiak>M

  2. maxk=ji{ak}=aj

第一个限制没什么好说的,第二个限制的原因是dpi单调不降,对于max的值相同的部分,我们肯定是取更靠前的更优

因此我们对ai维护单调递减的单调队列,这里单调队列表示的是可能成为答案的部分,而不是直接维护答案

对于在单调队列里的元素,我们用一个堆来维护dpj+maxk=j+1i{ak}的值。当单调队列里的某个元素删掉时,这个堆也删掉这个元素;同理,当单调队列中被加入元素时也加入

但这里有一个问题:dpj+maxk=j+1i{ak}i的右端点是会向后移动来影响答案的,但我们无法做到实时更新max的值

但我们假设在加入元素i后单调队列里的值为:q1,q2,...,qt,i,我们发现此时会影响的答案只有qt,因此我们只需要把qt在堆中的答案删掉后加入新的即可

堆的具体实现可以使用multiset

最终复杂度O(nlogn),复杂度瓶颈在于堆

posted @   FOX_konata  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示