2020杭电多校第8场 B.Breaking Down News
有一个长度为$n$的数组$a$, 满足$a_i \in \{0, 1, 2\}$, 你要将其划分成一些连续的区间, 每个区间的长度在$[L, R]$之间, 每个区间的贡献是:
- $-1$: 这个区间的和小于$0$
- $0$: 这个区间的和等于$0$
- $1$: 这个区间的和大于$0$
问最后总的贡献最大是多少
$1 \le L \le R \le n \le 10^6$
显然dp. 设$dp(i)$为前$i$个划分区间的最大贡献, 有
$$ dp(i) = \max_{L \le i-j \le R} \begin{cases} dp(j) + 1, & s_i - s_j > 0 \\ dp(j), & s_i - s_j = 0 \\ dp(j) - 1, & s_i - s_j < 0 \end{cases} $$
($s_i$ 表示$a_i$的前缀和)
朴素转移是$O(n^2)$的, 考虑优化.