斜率优化

大多数时候是动态转移方程牵扯到 二元二次 的一类满足决策单调性

  • 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 \]

posted @ 2022-08-12 10:09  Cust10  阅读(47)  评论(0)    收藏  举报