#HK3919. 「PA 2022」Nawiasowe podziały

「PA 2022」Nawiasowe podziały

题目描述

题目译自 PA 2022 Runda 5 Nawiasowe podziały

我确信你是知道括号序列的,但是以防万一,并且作为回顾,让我们回忆一下它的定义:

  • () 是一个合法的括号序列。
  • 如果 SS 是一个合法的括号序列,那么 (S) 也是一个合法的括号序列。
  • 如果 S1S_1S2S_2 都是合法的括号序列,那么 S1S2S_1S_2 也是一个合法的括号序列。
  • 不符合上述规则的括号序列都不是合法的括号序列。

给出一个长度为 nn 且仅由字符 () 组成的字符串,以及一个数字 kk,这个字符串不一定是合法的括号序列。你的任务是把它分成 kk 个非空段(每个字符必须恰好属于一段内),使得每段中是合法括号序列的子串个数之和最小。

输入格式

第一行两个整数 n,k (1kn100 000)n,k\ (1\le k\le n\le 100\ 000),分别表示字符串长度和要分成的段数。

第二行一个长度为 nn 的字符串,保证字符串仅由 () 组成。

输出格式

输出一行一个整数,表示所有段中是合法括号序列的子串个数之和的最小值。

15 2
())(()())()(())

6

最优的分段方法为:

$$\texttt{())(()())()(())}=\texttt{())(()(}\mid\texttt{))()(())} $$

第一段中有两个子串是合法的括号序列:

  • ())(()(\underline{\texttt{()}}\texttt{)(()(}
  • ())(()(\texttt{())(}\underline{\texttt{()}}\texttt{(}

第二段中有四个子串是合法的括号序列:

  • ))()(())\texttt{))}\underline{\texttt{()}}\texttt{(())}
  • ))()(())\texttt{))()(}\underline{\texttt{()}}\texttt{)}
  • ))()(())\texttt{))()}\underline{\texttt{(())}}
  • ))()(())\texttt{))}\underline{\texttt{()(())}}

所以把它们加起来,答案为 66

15 3
())(()())()(())

3

最优的分段方法为:

$$\texttt{())(()())()(())}=\texttt{())((}\mid\texttt{)())()((}\mid\texttt{))} $$

数据范围与提示

  • 某些子任务满足 n18n\le 18
  • 某些子任务满足 n300n\le 300
  • 某些子任务满足 n4 000n\le 4\ 000
  • 某些子任务满足 k30k\le 30

对于上面提到的每种情况,都存在至少一个子任务满足。这些子任务满足条件可能不相交,也可能相交。