1 条题解

  • 0
    @ 2025-10-28 8:37:06

    题目理解

    我们需要将 nn 段路分成 mm 天走完,要求每天走的路程长度的方差最小

    设第 ii 天走的路程为 xix_i,平均值为 xˉ=总路程m\bar{x} = \frac{\text{总路程}}{m},则方差为: [ v = \frac{1}{m} \sum_{i=1}^m (x_i - \bar{x})^2 ]

    题目要求输出 v×m2v \times m^2


    方差公式化简

    设总路程 S=i=1naiS = \sum_{i=1}^n a_i,则 xˉ=Sm\bar{x} = \frac{S}{m}

    方差: [ v = \frac{1}{m} \sum_{i=1}^m \left(x_i - \frac{S}{m}\right)^2 ]

    乘以 m2m^2: [ v \times m^2 = m \sum_{i=1}^m \left(x_i - \frac{S}{m}\right)^2 ]

    展开: [ = m \sum_{i=1}^m \left(x_i^2 - 2x_i \cdot \frac{S}{m} + \frac{S^2}{m^2}\right) ] [ = m \sum_{i=1}^m x_i^2 - 2S \sum_{i=1}^m x_i + m \cdot \frac{S^2}{m} ] [ = m \sum_{i=1}^m x_i^2 - 2S \cdot S + S^2 ] [ = m \sum_{i=1}^m x_i^2 - S^2 ]

    因此,最小化 v×m2v \times m^2 等价于最小化 i=1mxi2\sum_{i=1}^m x_i^2


    问题转化

    原问题转化为:将 nn 段路划分成 mm 个连续区间,使得每个区间的长度平方和最小。

    pre[i]pre[i] 表示前 ii 段路的总长度,即前缀和。

    则问题变成:在 pre[0],pre[1],,pre[n]pre[0], pre[1], \dots, pre[n] 中选择 mm 个分割点(包括首尾),将序列分成 mm 段,最小化: [ \sum_{j=1}^m (pre[r_j] - pre[l_j])^2 ] 其中 lj,rjl_j, r_j 是第 jj 段的起止位置。


    动态规划设计

    状态定义

    dp[i][k]dp[i][k] 表示将前 ii 段路分成 kk 天的最小平方和。

    状态转移

    [ dp[i][k] = \min_{j < i} { dp[j][k-1] + (pre[i] - pre[j])^2 } ] 其中 jj 是上一段的结束位置。

    初始化

    • dp[0][0]=0dp[0][0] = 0
    • 其他初始化为无穷大

    答案

    最终答案 = m×dp[n][m]S2m \times dp[n][m] - S^2


    斜率优化

    直接 DP 的复杂度是 O(n2m)O(n^2 m),对于 n,m3000n, m \leq 3000 会超时。

    观察转移方程: [ dp[i][k] = \min_{j < i} { dp[j][k-1] + pre[i]^2 - 2pre[i]pre[j] + pre[j]^2 } ] [ = pre[i]^2 + \min_{j < i} { dp[j][k-1] + pre[j]^2 - 2pre[i]pre[j] } ]

    令:

    • X(j)=pre[j]X(j) = pre[j]
    • Y(j)=dp[j][k1]+pre[j]2Y(j) = dp[j][k-1] + pre[j]^2
    • K(i)=2pre[i]K(i) = 2pre[i]

    则: [ dp[i][k] = pre[i]^2 + \min_{j < i} { Y(j) - K(i)X(j) } ]

    这正好是斜率优化的标准形式:最小化截距 Y(j)KX(j)Y(j) - KX(j)


    斜率优化实现

    维护一个凸壳,使得斜率单调递增。

    对于当前层 kk

    1. 在队列中维护可能的决策点 jj
    2. 当队首两点斜率小于 K(i)K(i) 时,弹出队首(因为 K(i)K(i)ii 递增)
    3. 队首即为最优决策
    4. ii 加入队列前,维护凸壳性质

    复杂度分析

    • 斜率优化后,每层 DP 复杂度 O(n)O(n)
    • 总复杂度 O(nm)O(nm)
    • 对于 n,m3000n, m \leq 3000 可以接受

    样例验证

    输入:

    5 2
    1 2 5 8 6
    

    计算过程:

    • 前缀和 pre=[0,1,3,8,16,22]pre = [0, 1, 3, 8, 16, 22]
    • 总路程 S=22S = 22
    • 分成 2 天的最优划分:第一天 [1,2,5][1,2,5](长度8),第二天 [8,6][8,6](长度14)
    • 平方和 82+142=64+196=2608^2 + 14^2 = 64 + 196 = 260
    • 答案 = 2×260222=520484=362 \times 260 - 22^2 = 520 - 484 = 36

    输出:36


    公式总结

    关键推导: [ v \times m^2 = m \sum_{i=1}^m x_i^2 - S^2 ] 其中 S=i=1naiS = \sum_{i=1}^n a_i

    因此只需最小化 i=1mxi2\sum_{i=1}^m x_i^2,使用斜率优化 DP。


    总结

    本题的关键在于:

    1. 将方差公式化简为平方和最小化问题
    2. 识别出可以使用动态规划求解
    3. 应用斜率优化降低复杂度
    4. 注意前缀和的使用和边界条件处理

    这是一个经典的斜率优化 DP 问题,考察了数学公式化简和动态规划优化的能力。

    • 1

    信息

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