#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
const int N=705;
int dp[N][N][3][3],pos[N];
char s[N];
void DFS(int l,int r){
if(r==l+1){
dp[l][r][0][1]=dp[l][r][0][2]=dp[l][r][1][0]=dp[l][r][2][0]=1;
}
else if(pos[l]==r){
DFS(l+1,r-1);
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
if(j!=1)dp[l][r][0][1]+=dp[l+1][r-1][i][j],dp[l][r][0][1]%=mod;
if(j!=2)dp[l][r][0][2]+=dp[l+1][r-1][i][j],dp[l][r][0][2]%=mod;
if(i!=1)dp[l][r][1][0]+=dp[l+1][r-1][i][j],dp[l][r][1][0]%=mod;
if(i!=2)dp[l][r][2][0]+=dp[l+1][r-1][i][j],dp[l][r][2][0]%=mod;
}
}
}
else{
DFS(l,pos[l]);
DFS(pos[l]+1,r);
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
for(int p=0;p<=2;p++){
for(int q=0;q<=2;q++){
if((j==1&&p==1)||(j==2&&p==2)) continue;
dp[l][r][i][q]+=(dp[l][pos[l]][i][j]*dp[pos[l]+1][r][p][q]%mod);
dp[l][r][i][q]%=mod;
}
}
}
}
}
}
int32_t main(){
cin>>s+1;int sz=strlen(s+1);
stack<int> sta;
for(int i=1;i<=sz;i++){
if(s[i]=='(') sta.push(i);
else{
int tp=sta.top();sta.pop();
pos[tp]=i;
}
}
DFS(1,sz);
int ans=0;
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
ans+=dp[1][sz][i][j];ans%=mod;
}
}
cout<<ans<<endl;
}
D. Coloring Brackets(区间dp
最新推荐文章于 2024-02-10 21:33:35 发布