using
System;
public
class
Solution
{
static
readonly
int
mod = 1000000007;
static
int
[][][][] memo =
new
int
[205][][][];
static
Solution()
{
for
(
int
i = 0; i < memo.Length; i++)
{
memo[i] =
new
int
[205][][];
for
(
int
j = 0; j < memo[i].Length; j++)
{
memo[i][j] =
new
int
[12][];
for
(
int
k = 0; k < memo[i][j].Length; k++)
{
memo[i][j][k] =
new
int
[2];
for
(
int
l = 0; l < 2; l++)
{
memo[i][j][k][l] = -1;
}
}
}
}
}
static
int
dp(
int
idx,
int
N,
int
K,
string
S,
int
cn,
int
p,
int
last)
{
if
(idx >= N && cn == 0 && p <= K)
return
1;
if
(idx >= N || p > K || cn < 0)
return
0;
if
(memo[idx][cn][p][last] != -1)
return
memo[idx][cn][p][last];
long
x = 0;
if
(S[idx] !=
'?'
)
{
if
(last == S[idx] -
'('
)
{
if
(S[idx] ==
'('
)
x += dp(idx + 1, N, K, S, cn + 1, p + 1, last);
else
x += dp(idx + 1, N, K, S, cn - 1, p + 1, last);
}
else
{
if
(S[idx] ==
'('
)
x += dp(idx + 1, N, K, S, cn + 1, 1, 1 - last);
else
x += dp(idx + 1, N, K, S, cn - 1, 1, 1 - last);
}
}
else
{
if
(last == 0)
{
x += dp(idx + 1, N, K, S, cn + 1, p + 1, last) % mod;
x += dp(idx + 1, N, K, S, cn - 1, 1, 1 - last) % mod;
}
else
{
x += dp(idx + 1, N, K, S, cn - 1, p + 1, last) % mod;
x += dp(idx + 1, N, K, S, cn + 1, 1, 1 - last) % mod;
}
}
x %= mod;
return
memo[idx][cn][p][last] = (
int
)x;
}
static
int
CountStrings(
int
N,
string
S,
int
K)
{
return
dp(0, N, K, S, 0, 0, 0);
}
public
static
void
Main(
string
[] args)
{
int
n = 6;
string
s =
"((??))"
;
int
k = 3;
Console.WriteLine(CountStrings(n, s, k));
}
}