题意:给你一串长度为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逐渐递增的。