• 区间最大连续和算法


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

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

  • 相关阅读:
    BZOJ4923 K小值查询(splay)
    BZOJ4919 大根堆(动态规划+treap+启发式合并)
    BZOJ4922 Karp-de-Chant Number(贪心+动态规划)
    BZOJ4915 简单的数字题
    BZOJ4921 互质序列
    BZOJ4898/5367 Apio2017商旅(分数规划+floyd)
    BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)
    Educational Codeforces Round 55 Div. 2 翻车记
    166. Fraction to Recurring Decimal
    390. Elimination Game
  • 原文地址:https://www.cnblogs.com/shinecheng/p/3169951.html
Copyright © 2020-2023  润新知