1 条题解
-
0
题目理解
我们需要将 段路分成 天走完,要求每天走的路程长度的方差最小。
设第 天走的路程为 ,平均值为 ,则方差为: [ v = \frac{1}{m} \sum_{i=1}^m (x_i - \bar{x})^2 ]
题目要求输出 。
方差公式化简
设总路程 ,则 。
方差: [ v = \frac{1}{m} \sum_{i=1}^m \left(x_i - \frac{S}{m}\right)^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 ]
因此,最小化 等价于最小化 。
问题转化
原问题转化为:将 段路划分成 个连续区间,使得每个区间的长度平方和最小。
设 表示前 段路的总长度,即前缀和。
则问题变成:在 中选择 个分割点(包括首尾),将序列分成 段,最小化: [ \sum_{j=1}^m (pre[r_j] - pre[l_j])^2 ] 其中 是第 段的起止位置。
动态规划设计
状态定义
设 表示将前 段路分成 天的最小平方和。
状态转移
[ dp[i][k] = \min_{j < i} { dp[j][k-1] + (pre[i] - pre[j])^2 } ] 其中 是上一段的结束位置。
初始化
- 其他初始化为无穷大
答案
最终答案 =
斜率优化
直接 DP 的复杂度是 ,对于 会超时。
观察转移方程: [ 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] } ]
令:
则: [ dp[i][k] = pre[i]^2 + \min_{j < i} { Y(j) - K(i)X(j) } ]
这正好是斜率优化的标准形式:最小化截距 。
斜率优化实现
维护一个凸壳,使得斜率单调递增。
对于当前层 :
- 在队列中维护可能的决策点
- 当队首两点斜率小于 时,弹出队首(因为 随 递增)
- 队首即为最优决策
- 将 加入队列前,维护凸壳性质
复杂度分析
- 斜率优化后,每层 DP 复杂度
- 总复杂度
- 对于 可以接受
样例验证
输入:
5 2 1 2 5 8 6计算过程:
- 前缀和
- 总路程
- 分成 2 天的最优划分:第一天 (长度8),第二天 (长度14)
- 平方和
- 答案 =
输出:
36✓
公式总结
关键推导: [ v \times m^2 = m \sum_{i=1}^m x_i^2 - S^2 ] 其中 。
因此只需最小化 ,使用斜率优化 DP。
总结
本题的关键在于:
- 将方差公式化简为平方和最小化问题
- 识别出可以使用动态规划求解
- 应用斜率优化降低复杂度
- 注意前缀和的使用和边界条件处理
这是一个经典的斜率优化 DP 问题,考察了数学公式化简和动态规划优化的能力。
- 1
信息
- ID
- 4347
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者