原题解链接:https://ac.nowcoder.com/discuss/151505
使用,设因表示当前处理到的第位,在最终的S中左括号比右括号多个,当前的状态为,其中的意义如下:
1.没有反转
2.正在反转
3.反转完成
转移讨论当前这一位在中是什么,结合即可得出的变化。
#include<bits/stdc++.h>
#define Mod 1000000007
#define N 5005
using namespace std;
char s[N];int dp[N][N][3];
int main(){
scanf("%s",s+1);
int n=strlen(s+1);
dp[0][0][0]=1;
for (int i=1;i<=n;i++){
for (int j=0;j<i;j++){
if (s[i]!=')'){
dp[i][j+1][0]=(dp[i][j+1][0]+dp[i-1][j][0])%Mod;
if (j) dp[i][j-1][1]=(dp[i][j-1][1]+dp[i-1][j][0])%Mod;
if (j) dp[i][j-1][1]=(dp[i][j-1][1]+dp[i-1][j][1])%Mod;
dp[i][j+1][2]=(dp[i][j+1][2]+dp[i-1][j][1])%Mod;
dp[i][j+1][2]=(dp[i][j+1][2]+dp[i-1][j][2])%Mod;
}
if (s[i]!='('){
if (j) dp[i][j-1][0]=(dp[i][j-1][0]+dp[i-1][j][0])%Mod;
if (j) dp[i][j-1][2]=(dp[i][j-1][2]+dp[i-1][j][2])%Mod;
if (j) dp[i][j-1][2]=(dp[i][j-1][2]+dp[i-1][j][1])%Mod;
dp[i][j+1][1]=(dp[i-1][j][0]+dp[i][j+1][1])%Mod;
dp[i][j+1][1]=(dp[i-1][j][1]+dp[i][j+1][1])%Mod;
}
}
}
printf("%lld\n",(1ll*dp[n][0][2]+1ll*dp[n][0][1]+1ll*dp[n][0][0])%Mod);
return 0;
}