以 dp 求中最小值为例,最大值同理
- 写出转移朴素 dp 转移方程,如
min{dp[j] + (i - j) * (i - j - 1) / 2} + a[i]
(随便举一个例子) - 将只和 $j$ 有关的项放在一起,同时和 $i$、$j$ 有关的项放在一起,之和 $i$ 有关的项提到
min{}
或max{}
外面(如果无法直接变形,可以先展开):min{dp[j] + j * (j + 1) / 2 - j * i} + i * (i - 1) / 2 + a[i]
- 确定每条直线的斜率和截距,在这个例子中,第 $i$ 条直线的斜率为
-i
,截距为dp[i] + i * (i + 1) / 2
(使用斜率优化的要求:直线斜率逐条递减,求每个dp[i]
时自变量取值逐个递增) - 套斜率优化模板,如下(将
k<i>
、b<i>
和rest<i>
分别替换为推导出的斜率如-i
、截距如dp[i] + i * (i + 1) / 2
和{}
外的式子如i * (i - 1) / 2 + a[i]
)
|
|