暂时起草思路,等待实现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转移方程的实质就是,要么答案在这里,要么答案在那里,要么答案在…… 得到答案的方法就是取最佳值
获得转移方程的一条途径就是分类讨论。