区间最大连续和算法

暂时起草思路,等待实现ing

名称:

RMQ扩展算法。(求区间最大连续和)

算法复杂度:

O(nlgn) + O(q)  q为提问次数。

预处理:

两个sum数组,意义是从第一个(最后一个)到第i个 这么多数的和。

对两个sum数组进行rmq预处理

类似rmq对整个待查询数组(a)预处理 {

    d[i][0] = a[i];

    d[i][j] = max (d[i][j-1], d[i+2^(j-1)][j-1], sumL[rmq(i,i+2^(j-1))] + sumR[rmq(i+2^(j-1), i+2^j)] - sumALL)

}

d[i][j] 表示第i个 到 第  i+2^j 个 区间内 的最大连续和

sumL 表示从左端开始加,sumALL表示整个数组的和

状态表达式的意思如下图

跨越线的区间的求法为,这线往左求最大连续区间,这线往右求最大连续区间,和起来就是跨这线的。

也就是某一方向加和,在区间中最大的那个和,减去这线之前的和,就是这线往某一方向的最大连续区间。

 

查询:

类似rmq

具体如下图

最长连续区间要么在绿色区间内,要么在橙色区间内,要么横跨2号区间,并且在1和3区间内都有,即灰色

绿色橙色为rmq式正常查询,灰色则再用上面的求跨越线区间的方法(线可以取(L+R)/2)。

总结:

复杂度:

dp复杂度和dp的状态数量相同。

所以想要得到怎样的复杂度,就得往这个方向上想其状态。

预处理:

对于查询类预处理,RMQ给出了降低复杂度的很好思路。用这种思路的关键在于,处理好重叠区间可能造成的问题。(本题的灰色区间部分)

状态转移方程:

dp转移方程的实质就是,要么答案在这里,要么答案在那里,要么答案在……   得到答案的方法就是取最佳值

获得转移方程的一条途径就是分类讨论

 

 

 

posted on 2013-07-03 17:37  ShineCheng  阅读(1483)  评论(0编辑  收藏  举报

导航