见题解链接https://blog.csdn.net/sdjzping/article/details/19160013
#include<bits/stdc++.h>
using namespace std;
#define maxn 750
#define mod 1000000007
int len,p[maxn];
long long dp[maxn][maxn][][];
char s[maxn];
void match(){
stack<int>stk;
while(!stk.empty())stk.pop();
for(int i=;i<len;i++){
if(stk.empty()){
stk.push(i);
continue;
}
int t=stk.top();
if(s[i]==')'&&s[t]=='('){
p[t]=i,p[i]=t;
stk.pop();
}
else stk.push(i);
}
}
void dfs(int l,int r){
if(l==r)return;
if(l+==r){//只有一种情况
dp[l][r][][]=dp[l][r][][]=dp[l][r][][]=dp[l][r][][]=;
return;
}
if(p[l]==r){//配对了
dfs(l+,r-);
for(int i=;i<;i++)
for(int j=;j<;j++){
if(j!=)dp[l][r][][]=(dp[l][r][][]+dp[l+][r-][i][j])%mod;
if(j!=)dp[l][r][][]=(dp[l][r][][]+dp[l+][r-][i][j])%mod;
if(i!=)dp[l][r][][]=(dp[l][r][][]+dp[l+][r-][i][j])%mod;
if(i!=)dp[l][r][][]=(dp[l][r][][]+dp[l+][r-][i][j])%mod;
}
return;
}
//剩下的情况就是不能配对的情况
int tmp=p[l];
dfs(l,tmp);dfs(tmp+,r);
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
for(int m=;m<;m++)
if(!((k== && m==) || (k== && m==)))
dp[l][r][i][j]=(dp[l][r][i][j]+(dp[l][tmp][i][k]*dp[tmp+][r][m][j])%mod)%mod;
} int main(){
cin>>s;len=strlen(s);
memset(dp,,sizeof dp);
match();dfs(,len-);
long long ans=;
for(int i=;i<;i++)
for(int j=;j<;j++)
ans=(ans+dp[][len-][i][j])%mod;
printf("%lld\n",ans);
}