#xLYHDPybttg050608. 1613:打印文章
1613:打印文章
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
原题来自:HDU 3507
给出 个单词,每个单词有个非负权值 ,现要将它们分成连续的若干段,每段的代价为此段单词的权值和的平方,还要加一个常数 ,即 。现在想求出一种最优方案,使得总费用之和最小。
输入格式
包含多组测试数据,对于每组测试数据:
第一行包含两个整数 和 。
第二行为 个整数 。
输入以 EOF(文件结束)终止。
输出格式
对于每组数据,输出一行一个整数,表示最小的总费用。
样例
样例输入
5 5
5 9 5 7 5
样例输出
230
样例说明
,单词权值 。
设前缀和 ,则分段 的代价为 。
我们需要将序列分成若干段,使总代价最小。
一种最优分段:
- 第一段:[5,9,5] 和 ,代价
- 第二段:[7,5] 和 ,代价
总代价 ,不是 230。
显然 230 更小,说明分段更细。
尝试全部分开:
(5) 25+5=30
(9) 81+5=86
(5) 25+5=30
(7) 49+5=54
(5) 25+5=30
总和 230。
因此样例最优方案是每个单词单独成一段。
数据范围
对于全部数据:
- (非负)
时空限制
- 时间:
- 内存:
提示
此题为 斜率优化 DP 经典题。
状态设计:
设 表示前 个单词分成若干段的最小总费用。
转移方程:
考虑最后一段为 ,则:
其中 是 的前缀和。
展开:
$$dp[i] = \min_{0 \le j < i} \left\{ dp[j] + S_i^2 - 2S_i S_j + S_j^2 + M \right\}$$合并与 无关的项:
$$dp[i] = S_i^2 + M + \min_{0 \le j < i} \left\{ dp[j] - 2S_i S_j + S_j^2 \right\}$$令 , ,则:
$$dp[i] = S_i^2 + M + \min_{0 \le j < i} \left\{ B_j - 2S_i A_j \right\}$$斜率优化:
对于 ,决策 优于 的条件为:
由于 单调非降(), 单调递增,因此可以用单调队列维护下凸包,队首为最优决策。
步骤:
- 计算前缀和 ;
- 初始化队列,将 入队();
- 遍历 从 到 :
- 若队首两点斜率 ,则弹出队首;
- 取队首 计算 ;
- 将 加入队尾,维护凸包(弹出队尾上凸点);
- 输出 。
复杂度 ,可以处理 高达 的数据。
注意:
- 有多组测试数据,需要清空队列等;
- 当 时,总费用为 ;
- 使用
long long存储中间结果,避免溢出。