POJ3017 单调队列+线段树+DP

题意:给你串长度为N<=100000的数字,和另一个单独的数字M,现在要把串切割,使每一连续部分的和都小于等于M,要求各部分最大值的和最小。


朴素的DP转移方程

DP[i]=Min(DP[j]+Max(A[k] )    0<=j<i ,   j<k<=i ,Sum[i]-Sum[j-1]<=M

复杂度为O(n^2)

需要优化


可以看到,求Max(A[k])  可以转化成用单调队列维护的问题,对于被条件(Sum[i]-Sum[j-1]<=M)约束的给定区间,每当遍历到一个元素A[n]判断是否队尾元素是否出队,若当前队尾元素小于A[n],则说明在该区间及其以后的区间内,队尾元素永远不可能是最大值并影响到最终的结果。然后根据Sum[i]-Sum[j-1]<=M的约束条件判断队首出队


在用单调队列维护最大值的同时,用线段树维护(DP[j] +Max( A[k]))这个整体,此时Max(A[k])即为单调队列的队首元素,

 

需要注意的时,该线段树的下标是根据当前所求DP[i]的下标i逐渐递增的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值