【2024信友队 - 提高模考】 新编套题2 T2:均匀的括号
题面:均匀的括号(Bracket.cpp)
题目描述
我们按如下方式递归定义一个合法的括号序列及其深度:
- 空串是一个合法的括号序列,且深度为 $0$ 。
- 若 $S$ 是一个合法的括号序列且深度为 $h$ ,则 $(S)$ 是一个合法的括号序列且深度为 $h+1$ 。
- 若 $A,B$ 都是合法的括号序列,且深度分别为 $h_A,h_B$ ,则 $A+B$(其中
+
表示字符串的拼接)是一个合法的括号序列且深度为 $max(h_A,h_B)$ 。
若一个括号序列是合法的且深度 $≤L$ ,则称其是一个均匀的括号序列。现在给你一个合法的括号序列 $S$ 及正整数 $L$ ,问要使其均匀,至少要修改其中多少个括号。(容易发现,当 $L$ 是正整数时,至少存在一种方案)
思路:暴力 & 正解(贪心)
暴力很简单,直接暴力枚举所有状态,然后把合法的串给和原串匹配,取最小值。
1 | def main() : |
接下来我们想正解。最直观的想法,就是遇到一个非法的括号就拆,但是这样显而易见是不优的。考虑优化。
我们发现,对于一对非法的括号(深度非法,因为题目保证给出的是合法括号序列)拆除是解决的最好方式。而我们要考虑的是,拆除的位置是否有影响。假设非法括号对的下表是 $x$ ,那么 $x$ 以前一定都是合法,不然会优先拆除前面,而后面的不管是拆在 $x$ 点还是 $x$ 点以前,都是一样的。所以直接开贪。
代码:正解代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 祝馀宫!
评论