[ABC386F] Operate K 的题解
考察:DP、二进制。
题意
判断是否有可能在
-
对于每次操作,从以下三个子操作中选择一个并执行。
- 在
S 的任意位置插入一个字符(可能是开头或结尾)。 - 从
S 中删除一个字符。 - 在
S 中选择一个字符并替换为另一个字符。数据限制
- 在
-
-
## 思路一 用 DP,设 $dp_{i,j}$ 表示将 $S_1...S_i$ 改成 $T_1...T_j$,最少需要几次操作。最后只需要判断 $dp_{N,M} \le K$ 即可。分操作进行转移: -
删除一个字符,即
dp_{i - 1,j} + 1 。 -
添加一个字符,即
dp_{i,j - 1} + 1 。 -
修改一个字符,即
dp_{i - 1,j - 1} + 1 。 -
不需要操作,满足
S_i = T_j ,即dp_{i - 1, j - 1} 。
这要暴力的时间复杂度为
注意到
对于在 DP 过程中类似这样的优化,我们将此方法称为 稀疏性优化(Sparsity),这本来是人工智能里的一个内容。抽象成一个坐标系
- 若
dp_{i,j} 被计算有意义,在xOy 中记录一个点(i,j) 。若这些点分布在一条由点A = (0,k_1),B = (k_2, 0) 连成的线段AB 附近(其中k_1,k_2 \isin \R_+ )。那么只需要计算一部分的点,而不是计算所有满足i \isin (0,k_1],j\isin (0,k_2] 的点(i,j) 。
其本质上是来解一个线性方程组,其中
这里没必要继续深入,代码并不难写,跑了 147ms。
思路二
我们发现 DP 数组中存储的值都不大,所以可以把数组的定义改一下:vector。但是,如果暴力维护 vector,复杂度是
注意到,long long 进行压位,转移时使用位运算即可。转移方程与思路一类似,无需赘述。
时间复杂度为 93ms。代码。