-
选取尽可能多(设选了
k 个)的
() 直至无解(具体的,不断选取接下来的首个
( 或
))。这显然是最优的。删去最后一个
() 之前得所有未在
() 之中的括号。
-
从前往后扫一遍
T,没有匹配上的括号在
S 中不优:以
) 为例,若其在
S 中则前面必然有至少有一个
) 不在
S 中,因为现在这个
) 居然能匹配上,那把这个
) 在
S 中删除,前面的
) 加入
S 必然不劣。如此
T 变成一合法括号序列。
-
此时需要在
S 的后缀中选取长为
K−2k 的字典序最大合法括号序列,且已知答案不可能以
() 开头。则首要目标是最小化前导
( 个数,我们考虑每次选出一个前导的
( 与对应的
) 删除。若该
S 后缀形如
((((.).).).)...:
对比下来看,一个合法括号序列肯定是
( 打头,或者是空串,前者删除次外层更劣后者则没有区别,删除其于非最外层
( 的结果是类似的。可见应当不断删除最外层
( 和其对应的
) 直至
∣S∣=K−2k。
-
把
S 写成
a 个
() 拼上
b 个最外层合法括号序列(令后者为括号序列
B)形式。
-
不断在
B 开头插入
(,两个最外层合法括号序列之间插入
)。
-
在
B 的最外层合法括号序列间隔中依次插入一些
))..)((..(。不在
B 中插入的原因是会记重,即插入这些括号的地方要真的失配。
-
选取一字符串
A 满足恰好包含了
a 个不交的
(),并且最后以
() 结尾。
-
对于中间三步分别考虑,写出关于新插入字符数的生成函数,最终取
[xn−K] 即可:
-
设最后面的
) 插入在了第
i 个最外层合法括号序列后,答案为
(1−x2)ix2。特判这一步没有插入任何括号的情况。
-
设第
2 步中设最后面的
) 插入在了第
i 个最外层合法括号序列后,则此时还有
b−i+1 个最外层合法括号序列,先不区分左右括号,最终再划定其分界线,答案为:(共
b−i+2 个位置可插括号,插板计算方案数)
===j≥0∑(j+1)(b−i+1j+b−i+1)xj(xj≥0∑(b−i+1j+b−i+1)xj)′((1−x)b−i+2x)′(1−x)b−i+3(b−i+1)x+1
- 开头可以插
),() 间可以插 (,)( 间可以插 ),答案即为 (1−x)2a1。
相乘,求和,方案数为:
=[xN−K]1≤i≤b∑(1−x2)ix2(1−x)b−i+3(b−i+1)x+1(1−x)2a1[xN−K](1−x)2a+b+3x21≤i≤b∑(1+x)i(b−i+1)x+1
0≤i<b∑(1+x)i10≤i<b∑(1+x)ii=1+x1−x(x+1)b−11=−(1+x)(0≤i<b∑(1+x)i1)′=−(1+x)(x1−x(x+1)b1)′=x1+x21−(x+1)b−1bx+1
再带回原式:
===1+x10≤i<b∑(1+x)i(b−i)x+1x+11((bx+1)0≤i<b∑(1+x)i1−x0≤i<b∑(1+x)ii)x+11((bx+1)(1+x1−x(x+1)b−11)−1−x1+x(x+1)b−1bx+1)b
再加上没有在第二步插入括号的情况,答案即为:
[xN−K](1−x)2a+b+3bx−x+1=(b−1)(2a+b+2N−K+2a+b+1)+(2a+b+2N−K+2a+b+2)
还得特判一下
b=0 的情况,直接用第四步推得的东西,再在最后插一些任意的括号。总复杂度
O(N)。