凹凸序列优化

需要注意凹凸序列优化和斜率优化并不是一个东西。

定义一个排列是凸序列,当且仅当满足这个序列的差分数组单调不升;反之如果这个序列的差分数组单调不降,那么这个序列就是凹序列。

凸序列优化 DP 并不是一种求解的套路,而是一种思想,下面只是举一个比较常见的例子。

对于这样的一个转移方程:

\[f_{i}=\max\limits_{j+k=i} g_j+h_k \]

我们成这样的转移为 \(\max+\) 卷积,也就是 \(\max\)\(+\) 的卷积。

显然这个玩意可以 \(O(n^2)\) 的转移,但是如果 \(g\)\(h\) 都是凸序列,那么就会有更优的做法。

那么把 \(f_0\) 初始化为 \(g_0+h_0\),然后把两个序列看成:

\[\begin{array}{}g_1-g_0,g_2-g_1,g_3-g_2,\cdots,g_{n}-g_{n-1}\\h_1-h_0,h_2-h_1,h_3-h_2,\cdots,h_{n}-h_{n-1}\end{array} \]

那么求解 \(f_k\) 就相当于在两个序列的开头分别选择一些元素,要求总共选择 \(k\) 个元素,然后加上 \(f_0\)

因为这两个序列都是上凸的,所以其差分数组是单调不升的,于是贪心的维护两个指针选择最开头的元素中大的那一个就行了,这样也就是可以在 \(O(n)\) 的时间复杂度里求解了。

posted @ 2025-09-26 14:37  未抑郁的刘大狗  阅读(7)  评论(0)    收藏  举报