给定一个长度为n的括号序列a,问:构成长度为m( n ≤ m n \leq m n≤m)的合法括号序列b有多少种方案。
f [ i ] [ j ] [ k ] : 表示长度为 i 的序列 b 包含 a 的前 j 个,且还有 k 个左括号还没有匹配的方案数 f[i][j][k]:表示长度为i的序列b包含a的前j个,且还有k个左括号还没有匹配的方案数 f[i][j][k]:表示长度为i的序列b包含a的前j个,且还有k个左括号还没有匹配的方案数
int n, m;
ll f[202][202][202];
int main()
{
IOS;
int T; cin >> T;
while (T--)
{
cin >> n >> m;
string s; cin >> s;
s = " " + s;
f[0][0][0] = 1;
for(int i = 1; i <= m; i++)
for(int j = 0; j <= min(i, n); j++)
for (int k = 0; k <= i; k++)
{
f[i][j][k] = 0;
if (j == 0)
{
if(k) f[i][j][k] += f[i - 1][j][k - 1];//第i位为左括号
f[i][j][k] += f[i - 1][j][k + 1];//第i位为右括号
}
else if (s[j] == '(')
{
if(j && k) f[i][j][k] += f[i - 1][j - 1][k - 1];//第i位为左括号
f[i][j][k] += f[i - 1][j][k + 1];//第i位为右括号
}
else
{
if(k) f[i][j][k] += f[i - 1][j][k - 1];//第i位为左括号
if(j) f[i][j][k] += f[i - 1][j - 1][k + 1];//第i位为右括号
}
f[i][j][k] %= mod;
}
cout << f[m][n][0] << endl;
}
return 0;
}