CF1860D 题解

· · 题解

首先考虑一个子问题,给两个只含有 01 的字符串 s, t,求至少要使用多少次交换 t 的任意两个字符的操作,使得 st 相等,或报告无解。

显然无解情况就是两个串 01 的出现次数不同。接下来我们排除相等的位置,设还剩 ks_i = \texttt{0}, t_i = \texttt{1} 的位置和 ks_i = \texttt{1}, t_i = \texttt{0} 的位置,每次选择一对 (0, 1) 交换,答案就是 k

回到原题,发现 n \le 100,那不就直接把题面中乱七八糟的条件塞进 dp 状态吗。设 f_{i, j, k}t 中填完 [1, i],填了 j0,当前 \texttt{01} 子序列个数减去 \texttt{10} 子序列个数 = kts 不相等的位置个数的最小值。转移就枚举第 i 个位置填 0 还是 1,如果填 1,那么 k 加上 [1, i - 1]0 的个数,否则 k 减去 [1, i - 1]1 的个数。

时间复杂度 O(n^4)

code