斜率优化
大多数时候是动态转移方程牵扯到 二元二次 的一类满足决策单调性。
-
Part I : 单调
-
HNOI 2008 - Toy :
\[f_i =\underset{j \leq i} \min \{f_{j - 1} + (i - j + s_i - s_{j - 1} - L)^2\}
\]
我们将仅仅有关一元的项提出 :
\[g_i = i + s_i - L
\]
\[h_j = j + s_{j - 1}
\]
\[f_i =\underset{j \leq i} \min \{f_{j - 1} + (g_i - h_j)^2\}
\]
\[f_i =\underset{j \leq i} \min \{f_{j - 1} + g_i^2 + h_j^2 -g_ih_j\}
\]
考虑到令决策 \((j_1, j_2) (j_1 < j_2)\) 中前者更优秀 :
\[f_{j_1 - 1} + h_{j_1}^2 -2g_ih_{j_1} <f_{j_2 - 1} + h_{j_2}^2 -2g_ih_{j_2}
\]
\[f_{j_1 - 1} + h_{j_1}^2 - f_{j_2 - 1} + h_{j_2}^2 < 2g_i(h_{j_1} - h_{j _2})
\]
\[\frac{f_{j_1 - 1} + h_{j_1}^2 - f_{j_2 - 1} + h_{j_2}^2}{h_{j_1} - h_{j _2}} = k_{(j_1, j_2)}> 2g_i
\]
考虑到 \(g_i\) 单调上升, 那么我们由于决策单调性, 可以考虑 :
维护一个队列(元素从小到大)使得队头 \(k(j_1, j_2) > 2g_i\) 即可,这样保证, 当一个新的决策变得更优秀, 我们可以及时将其弹出, 且所有的 \(k\) 递增。
while (s < t && Slope(Q[s], Q[s + 1]) <= 2 * f[i]) s ++;
dp[i] = dp[Q[s]] + Sqre(f[i] - f[Q[s]] - L - 1);
while (s < t && Slope(Q[t], i) <= Slope(Q[t - 1], Q[t])) t --; Q[++ t] = i;
- APIO2005 特别行动队
- P2900 : 删掉无用决策
暂时就这样。
- Conclusion :

- Part 没有单调性 :
\[k(i, j) = \frac{y_j -y_i}{x_j -x_i}< g(i)
\]
如果后者没有单调性, 那么我们可以考虑二分答案, 维护一个有序的队列。
那前者后者不单调咋办?
比较繁琐, 我丢个图片罢。

-
习题 :
-
P4072
这个强制选 m 段就非常入味, 考虑 wqs 二分。
\[f(m) = s^2m^2 = m\sum (x_i - \bar{x})^2 = m(\sum x_i^2 + \sum \bar{x}^2 + \sum 2x_i\bar{x})
\]
注意到,这里 \(f(m)\) 还嵌套了一层函数 \(g(m)\) 即 \(m\) 下的最优解,。
考虑到 \(f(m) + km\) 会使得 \(f^{'}(m)\) 的零点偏移,即 \(\delta =k\),考虑到 \(m\) 的增长会带来 \(g(m)\) 的增长。
所以 \(\delta <0\).
\[f_i = \underset{j = 0}\min\{f_j - 2x_ix_j + x_j^2\} + x_i^2
\]
考虑 \((j, k)\) 这一决策, 令前者优于后者。
\[f_j - 2x_ix_j +x_j^2 < f_k - 2x_ix_k +x_k^2
\]
\[\frac{f_j + x_j^2 - f_k - x_k^2}{x_j - x_k} < 2x_i
\]
登高自卑,行远自迩。

浙公网安备 33010602011771号