传送门
代码
#include <bits/stdc++.h>
using namespace std;
char a[10005];
long long f[705][705][2],M=1e9+7;
int yu(int x,int y) {
int book=1,sum=0;
for(int i=x;i<=y;i++) {
if(a[i]=='(') sum++;
else sum--;
if(sum<0) return 0;
if(!sum && i!=y && book==1) book=i;
}
if(sum) return 0;
return book;
}
int main() {
scanf("%s",a+1);
int n=strlen(a+1);
for(int len=2;len<=n;len+=2) {
for(int l=1;l<=n-len+1;l++) {
int r=l+len-1;
if(len==2) {
if(a[l]=='(' && a[r]==')')
f[l][r][0]=4,f[l][r][1]=1;
continue;
}
int book=yu(l,r);
if(!book) continue;
else if(book==1)
f[l][r][0]=(4*(f[l+1][r-1][0]-f[l+1][r-1][1])%M)%M,f[l][r][1]=(f[l+1][r-1][0]-f[l+1][r-1][1])%M;
else {
f[l][r][0]=((f[l][book][0]*f[book+1][r][0])%M-(f[l][book][1]*f[book+1][r][1]*2)%M+M)%M;
f[l][r][1]=(f[l][book][1]*f[book+1][r][0])%M;
}
}
}
printf("%lld",f[1][n][0]);
return 0;
}