单调队列优化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;
}
对于一个长度为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;
}
相关文章推荐
- 如何用IIS发布网站
- 浅析Spring AOP
- python中的join()函数
- C/S,B/S,P2P,O2O,C2C的特点是什么?
- 浅谈学习JS和JQuery中的几点收获
- 20145332课程总结
- Hadler机制,出理轮播图
- 拦截器与过滤器的区别
- spring security 的 logout 功能
- word如何修改尾注
- css选择器
- 感6.19
- SSH整合的历史--2层架构
- 滑动导航
- a
- 20145118 《Java程序设计》课程总结
- tomcat classpath classloader粗略学习心得
- 最优化之论单纯形法与对偶单纯性法的区别
- jsp与servlet的关系
- JavaScript对象的创建和继承实现