CodeForces 1264D Beautiful Bracket Sequence
给定一个长度为 n 的字符串,其中只有 '(', ')', '?'
三种字符,其中 '?'
可以为 '('
或者 ')'
。对于一个括号序列,定义其权值为其通过删除字符后可以得到的合法的括号匹配的最深的深度,求出所有可能的括号序列(即问号替换后)的权值和。
在 D1
中,n≤2000;在 D2
中,n≤106。
考虑枚举答案计算方案数,显然对于一个括号序列,存在一个划分点使得划分点左边的左括号个数等于划分点右边的有括号个数。则此时该括号序列的深度就是划分点左边的左括号个数。这样 dp
之后合并一下是 O(n2) 的。这样 D1
就做完了。
考虑把前面 dp
的式子转换成组合数,我们考虑每个分割点,前面有 l 个左括号,r个右括号,前面有 x 个问号,后面有 y 个问号。
其实答案就是:
i=0∑x(l+i)(ix)(l+i−ry)=li=0∑x(ix)(l+i−ry)+i=0∑xi(ix)(l+i−ry)
对于左边的式子:
= = li=0∑x(ix)(l+i−ry)li=0∑x(ix)(y+r−l−iy)l(y+r−lx+y)
对于右边的式子:
= = i=0∑xi(ix)(l+i−ry)i=0∑xx(i−1x−1)(y−l−i+ry)x(y−l+r−1x+y−1)
所以该点的贡献为:
l(y+r−lx+y)+x(y−l+r−1x+y−1)
代码就直接丢链接了:D1、D2。