滚动数组,只有 10 pts(这题数据是不是有误)
#include<bits/stdc++.h>
using namespace std;
const int N=5003,mod=1e9+7;
int n;
char s[N];
long long dp[3][N];
long long cal()
{
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)
{
if(s[i]=='(')
{
dp[i%2][0]=0;
for(int j=1;j<=n;j++)
{
if(i-1==0&&j-1==0)
dp[i%2][j]=1;
else
dp[i%2][j]=dp[(i-1)%2][j-1]%mod;
}
}
else
{
if(i==1)
{
dp[i%2][0]=(1+dp[(i-1)%2][1])%mod;
}
else
dp[i%2][0]=(dp[(i-1)%2][0]+dp[(i-1)%2][1])%mod;
for(int j=1;j<=n;j++)
dp[i%2][j]=(dp[(i-1)%2][j+1]+dp[i%2][j-1])%mod;
}
// for(int j=0;j<=n;j++)
// cout<<dp[i%2][j]<<" ";
// puts("");
}
int k=n%2;
for(int i=0;i<=n;i++)
if(dp[k][i]) return dp[k][i]%mod;
}
int main()
{
scanf("%s",s+1);
n=strlen(s+1);
long long ans1=cal();
reverse(s+1,s+n+1);
for(int i=1;i<=n;i++)
if(s[i]=='(') s[i]=')';
else s[i]='(';
long long ans2=cal();
printf("%lld",ans1*ans2%mod);
return 0;
}