您的位置:首页 > 其它

单调队列优化dp

2016-06-19 21:19 239 查看
来看个小例子:

     对于一个长度为n的整数序列(a1,a2,......,an),从中找出一段连续的长度不超过m的子序列,使得这个序列的和最大。

首先前缀和sum[i]=a[1]+a[2]....+a[i];     

    容易想到 f[i]=max{sum[i]-sum[k]}  (i-m<=k<i)

    时间复杂度为O(m*n)

优化 :先分离f[i]-sum[i]=max(-sum[k]);令p[i]=f[i]-sum[i];

其实看到这里用个堆优化也挺快的样子。但是既然这里要讲o(n)做法。那就继续。。。其实只要记住优先队列是一个队头最优的东东。。。然后超出k的时候要head++就好了。

  head=tail=0;

for 1 to n

while(head<tail) 

{  while(head不可以取的范围) head++

 dp
=calc(que[head])

  while(tail使队列单调递减) tail--;

加入 i;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: