1 条题解

  • 0
    @ 2026-9-3 10:42:06

    分组游戏题解

    思路

    设 w(l,r)w(l,r) 为子数组 al,…,ara_l,\ldots,a_r 的代价。朴素分组动态规划为

    $$dp_{g,r}=\min_{g\le p\le r}\{dp_{g-1,p-1}+w(p,r)\}.$$

    小规模可以枚举所有 k−1k-1 个切分位置。中规模按右端点向左扫描,维护每个值当前最左出现位置,即可在 O(n2k)O(n^2k) 时间完成上述转移。

    代价函数 ww 满足四边形不等式,因此每一层动态规划的最优决策点单调。可以用分治优化:计算区间中点时枚举给定的候选决策范围,再递归处理左右两半。

    分治过程中需要快速得到任意移动区间的代价。维护当前区间内每个值的出现位置双端队列。向右加入位置 ii 时,若该值已经出现,代价增加 i−lasti-last;向左加入时增加 first−ifirst-i。删除端点时做相反更新。这样每移动一个端点只需 O(1)O(1)。

    做法

    初始化 dp0,0=0dp_{0,0}=0,其余状态为无穷大。依次计算 g=1,2,…,kg=1,2,\ldots,k:

    1. 在合法下标区间 [g,n][g,n] 上调用分治过程。
    2. 对中点 mm 枚举决策点 pp,用当前窗口求出 w(p,m)w(p,m)。
    3. 记录最优决策点 qq;左半区间的决策范围缩为左端到 qq,右半缩为 qq 到右端。
    4. 完成一层后交换新旧动态规划数组。

    最终答案为 dpk,ndp_{k,n}。

    复杂度

    每层分治枚举与窗口移动的总复杂度为 O(nlog⁡n)O(n\log n),总时间复杂度为 O(knlog⁡n)O(kn\log n),空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    1286
    时间
    3000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者