斜率优化dp*

详细教程

https://www.cnblogs.com/orzzz/p/7885971.html

以下面的一道例题为例。

A.HDU 3507

给出 (N) 个单词,每个单词有个非负权值 (C_i) ,现要将它们分成连续的若干段,每段的代价为此段单词的权值和,还要加一个常数 (M) ,即 ((sum Ci)^2+M) 。现在想求出一种最优方案,使得总费用之和最小。 ((0 ≤ n ≤ 500000, 0 ≤ M ≤ 1000))

首先考虑 (n^2) dp。

[sum[i]=sum_{j=1}^i C_j ]

[dp[i]=min(dp[j]+(sum[i]-sum[j])^2+M) ]

考虑如何优化。
(j_1>j_2) ,且 (j_1) 优于 (j_2)

[dp[j_1]+sum[i]^2+sum[j_1]^2-2*sum[i]*sum[j_1]+M<dp[j_2]+sum[i]^2+sum[j_2]^2-2*sum[i]*sum[j_2]+M$$ $$dp[j_1]+sum[j_1]^2-dp[j_2]-sum[j_2]^2<2*sum[i]*(sum[j_1]-sum[j_2])]

[2*sum[i]>frac{dp[j_1]+sum[j_1]^2-dp[j_2]-sum[j_2]^2}{sum[j_1]-sum[j_2]} ]

原文地址:https://www.cnblogs.com/BlogOfchc1234567890/p/10885635.html