AtCoder-abc346_d 题解
题意
一个好 01
串 \(S\) 满足以下条件:
- 有且只有一个 \(i\),使得 \(S_i=S_{i+1}\)。
给定 01
串 \(S\) 和 \(C\) 序列,可以将 \(S_i\) 反转(0
变 1
,1
变 0
),花费 \(C_i\) 的价格。
求出将 \(S\) 变为好的 01
串的最少花费。
思路
好的 01
串 \(S\) 满足以下条件:
若 \(S_i=S_{i+1}\),则对于 \([1:i-1]\) 中的任意 \(j\),\(S_j \ne S_{j+1}\);对于 \([i,N-1]\) 中的任意 \(j\),\(S_j \ne S_{j+1}\)。
所以我们可以枚举 \(i\),然后计算出变成对应的好 01
串所需要的花费,最后取最小值。
但如果直接计算,时间复杂度为 \(\mathcal{O}(N^2)\)。这时我们需要前后缀和。
设:
-
\(A_i\) 为 \(S_1\) 为
1
时,将 \(S\) 的 \(1 \sim i\) 位变为好字符串所需要的花费; -
\(B_i\) 为 \(S_1\) 为
0
时,将 \(S\) 的 \(1 \sim i\) 位变为好字符串所需要的花费; -
\(D_i\) 为 \(S_1\) 为
1
时,将 \(S\) 的 \(i \sim N\) 位变为好字符串所需要的花费; -
\(E_i\) 为 \(S_1\) 为
0
时,将 \(S\) 的 \(i \sim N\) 位变为好字符串所需要的花费;
那么答案即为:
\(\min \limits_{i=1}^{N-1}(A_i+E_{i+1},B_i+D_{i+1})\)。