【题意说明】
有N个数的序列S,求长度在L~U之间的子序列最小和是多少?
【问题分析】
原本以为是个部分和问题,算来算去,好麻烦!后来想到用优先队列来处理:
边读入边累加和,这样要求出i~j之间的和则有sum[j]-sum[i-1],这里要求的是L~U子序列的最小和,要是枚举的话,显然要超时!利用优先队列可以实现O(1)算法的求对于任意位置j,其最小和应该为min{a[j]-a[i-1]},其中j-U<i<=j-L。
(1)若j<L,则最无最小和。
(2)若L=<j<U,则最小和为min{a[j]-a[i-1]}其中0<i<=j-L
(3)若j>=U,则其最小和应该为min{a[j]-a[i-1]},其中j-U<i<=j-L。
先不考虑(1),这部分可以单独处理,对于情况(2)可以看作为情况(3)的一种特例,所以我们只需要考虑情况(3)即可。
对于任何一个j,要求出以j为序列的最后一个元素的最小和,由上式可知为min{a[j]-a[i]},由于a[j]的值不变,则只需要找到满足条件的a[i]最大即可!
显然这个问题就归化为每次求固定长度内的最大值问题,这与poj 2823[Sliding Window ]相同,采用单调队列即可完成!