C. Famil Door and Brackets
大意就是给了一个长度为n的括号串S,要求在S之前加一个串P,在S之后加一个串Q,使得总长为m且保证PSQ
合法的方案数。
我们一共需要添加n-m的括号,我们定义括号串的值为左括号-右括号的个数
设DP状态f[i][j][0/1]
:
f[i][j][0]
表示添加的前i个括号中,括号串的值为j,且没有拼接上S的方案数,例如xxxxx(当前位置)
f[i][j][1]
表示添加的前i个括号中,括号串的值为j,拼接上S之后的方案数,例如xxxxSxxxx(当前位置)
f[i][j][0]+=f[i-1][j+1][0]+(j-1>=0?f[i]-1[j-1][0]:0)
f[i][j][1]+=f[i-1][j+1][1]+(j-1>=0?f[i]-1[j-1][1]:0)
这两个状态分别对应加上(
和)
然后对于加上S使得第三维从0->1的转化我们要在上述转移全部转移了之后做,下面思考要满足什么条件:
设S的值为val
,S的前缀中右括号比左括号多的值的最大值为pre_mn
,显然有拼接S的时候前面P至少有pre_mn
个左括号:
if(j-val>=pre_mn)
f[i][j][1] += f[i][j-val][0];
然后就写完了;
完整Code:
https://codeforces.com/contest/629/submission/178593539