AtCoder-abc346_d 题解

题意

一个好 01\(S\) 满足以下条件:

  • 有且只有一个 \(i\),使得 \(S_i=S_{i+1}\)

给定 01\(S\)\(C\) 序列,可以将 \(S_i\) 反转(0110),花费 \(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})\)

代码

posted @ 2024-06-09 13:00  lrx139  阅读(1)  评论(0编辑  收藏  举报