[题解]AT_abc234_g [ABC234G] Divide a Sequence

发布时间 2023-10-04 19:16:55作者: WaterSun_SYC

思路

定义 \(dp_i\) 表示将前 \(i\) 个分为若干段的价值总和。容易得到状态转移方程:

\[dp_i = \sum_{j = 1}^{i - 1}{dp_j \times (\max_{k = j + 1}^{i}\{a_k\} - \min_{k = j + 1}^{i}\{a_k\})} \]

于是考虑将其拆成 \(\max_{k = j + 1}^{i}\{a_k\}\)\(\min_{k = j + 1}^{i}\{a_k\}\) 两个子问题。

在这里我们先讨论 \(\max_{k = j + 1}^{i}\{a_k\}\) 这一子问题。

\(x\) 表示在 \(i\) 左边第一个大于 \(a_i\) 的位置。那么,一定有 \(\max_{k = x + 1}^{i}\{a_k\} = a_i\)\(\max_{k = 1}^{x}\{a_k\} > a_i\)

所以,\(a_i\) 能对答案产生贡献当且仅当 \(j > x\)\(x\) 是很好求的,直接用单调栈维护即可。

那么我们现在的问题就变为了如何求 \(j \leq x\) 所能产生的贡献。

考虑用一个数组 \(mx_i\) 表示 \(\sum_{j = 1}^{i - 1}{dp_j \times \max_{k = j + 1}^{i}\{a_k\}}\)

那么显然有:

\[mx_i = mx_x + (\sum_{k = x - 1}) \]