更差的阅读体验
建议难度:\(\color{#FFC116}\text{普及/提高-}\)
题目大意
定一个长度为 \(3^N\) 的二进制字符串 \(A\),通过 \(N\) 次操作将其压缩为长度为 \(1\) 的字符串 \(A'_1\)。每次操作将字符串分成长度为 \(3\) 的组,取每组的多数值作为新字符串的元素。目标是通过最少的修改次数(将 \(0\) 改为 \(1\) 或将 \(1\) 改为 \(0\)),使得最终的 \(A'_1\) 发生变化。
解题思路
-
操作过程:
每次操作都将字符串分成每 \(3\) 个字符为一组,对每组的 \(3\) 个字符取多数值:如果大于等于 \(2\) 个字符是1
,则该组的值为1
,否则为0
。每次操作都会使得字符串的长度缩小为原来的三分之一。 -
目标:
我们最终希望通过最少的位变化,将经过 \(N\) 次操作后得到的字符串的结果从当前值变为相反的值。 -
步骤:
- 模拟操作:
从输入字符串 $ A$ 开始,反复执行 $ N$ 次操作,得到最终的一个字符。 - 计算最小改变次数:
对于每次操作,我们需要计算在将字符串压缩的过程中,最少需要改变多少个位来改变最终结果。
- 模拟操作:
-
数据结构:
使用一个结构体ST
来存储每个字符变为0
和变为1
的代价。然后,通过动态规划的方式,逐步计算出最少的改变次数。
时间复杂度
每次操作都会将字符串的长度减少为原来的三分之一。每次对 \(3\) 个字符的子串进行处理,因此总体时间复杂度为 \(\text{O}(3^N)\)。对于 \(N \leq 13\) 的情况下,是完全可以被接受的。
link