第二个样例一直过不了,输出12。程序里s数组表示这一段是不是全为星,f[0]表示不用规则2的方案数,f[1]表示可以用规则2的方案数,f[2]表示“AS”这种形式的方案数
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int N=510,MOD=1e9+7;
int n,K,f[N][N][3];
char a[N];
bool s[N][N];
int main() {
scanf("%d%d",&n,&K);
scanf("%s",a+1);
for(int i=1;i<=n;i++) {
s[i+1][i]=true;
for(int j=i;j<=n;j++) {
if(j-i+1>=K) {
s[i][j]=false;
continue;
}
s[i][j]=true;
for(int k=i;k<=j;k++) {
if(a[k]!='*'&&a[k]!='?') {
s[i][j]=false;
break;
}
}
}
}
for(int l=2;l<=n;l++) {
for(int i=1;i+l-1<=n;i++) {
int j=i+l-1;
if((a[i]=='('||a[i]=='?')&&(a[j]==')'||a[j]=='?')) {
f[i][j][0]=s[i+1][j-1];
f[i][j][0]=(f[i][j][0]+f[i+1][j-1][1])%MOD;
for(int k=i+1;k<j-1;k++) {
if(!s[i+1][k]) break;
f[i][j][0]=(f[i][j][0]+f[k+1][j-1][1])%MOD;
}
for(int k=j-1;k>i+1;k--) {
if(!s[k][j-1]) break;
f[i][j][0]=(f[i][j][0]+f[i+1][k-1][1])%MOD;
}
f[i][j][1]=f[i][j][0];
for(int k=i;k<j;k++) {
f[i][j][1]=(f[i][j][1]+(ll)(f[i][k][1]+f[i][k][2])*f[k+1][j][0])%MOD;
}
}
for(int k=j;k>i;k--) {
if(!s[k][j]) break;
f[i][j][2]=(f[i][j][2]+f[i][k-1][1])%MOD;
}
}
}
printf("%d\n",f[1][n][1]);
return 0;
}