O(n4)算法,预计65pts但实际只有25pts
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=510;
const int MOD=1e9+7;
int n,k;
string s;
int g[N][N],f[N][N];
int c[N][N];
//g[i][j]表示序列两端不匹配的方案数
//f[i][j]表示序列两边匹配的方案数
void prework(){
for(int i=1;i<=n;i++) c[i][i-1]=1;
for(int i=1;i<=n;i++) if(s[i]=='*'||s[i]=='?') c[i][i]=1;
for(int len=2;len<=n;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
if(c[l][r-1]&&(s[r]=='*'||s[r]=='?')) c[l][r]=1;
}
}
}
signed main(){
cin>>n>>k>>s;
s=" "+s;
prework();
for(int len=2;len<=n;len++){
for(int l=1;l+len-1<=n;l++){
int r=l+len-1;
if((s[l]!='('&&s[l]!='?')||(s[r]!=')'&&s[r]!='?')) continue;
if(l+1==r){f[l][r]=1;continue;}
f[l][r]=(f[l][r]+f[l+1][r-1]+g[l+1][r-1])%MOD;//(A)
if(c[l+1][r-1]) f[l][r]=(f[l][r]+1)%MOD;//(S)
for(int i=l+2;i<=r-2;i++) if(r-i-1<=k&&c[i+1][r-1]) f[l][r]=(f[l][r]+(f[l+1][i]+g[l+1][i])%MOD)%MOD;//(AS)
for(int i=l+2;i<=r-2;i++) if(i-l-1<=k&&c[l+1][i-1]) f[l][r]=(f[l][r]+(f[i][r-1]+g[i][r-1])%MOD)%MOD;//(SA)
for(int i=l+1;i<=r-1;i++){
for(int j=i+1;j<=r-1;j++){
if(j-i-1<=k&&c[i+1][j-1]) g[l][r]=(g[l][r]+(f[l][i]+g[l][i])*f[j][r]%MOD)%MOD;//(ASB)
}
}
}
}
int ans=(f[1][n]+g[1][n])%MOD;
cout<<ans;
return 0;
}