您的位置:首页 > 其它

区间最大连续和算法

2013-07-03 17:37 197 查看
暂时起草思路,等待实现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转移方程的实质就是,要么答案在这里,要么答案在那里,要么答案在…… 得到答案的方法就是取最佳值

获得转移方程的一条途径就是分类讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: