Sequence

【原题链接】

【题意说明】

有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 ]相同,采用单调队列即可完成!

posted on 2012-10-31 21:11  生活不变心在变  阅读(190)  评论(0编辑  收藏  举报

导航