原题解链接:https://ac.nowcoder.com/discuss/151505

使用DPDP,设f[i][j][k]f[i][j][k]因表示当前处理到SS''的第ii位,在最终的S中左括号比右括号多jj个,当前SS'的状态为kk,其中kk的意义如下:

1.没有反转

2.正在反转

3.反转完成

转移讨论当前这一位在SS'中是什么,结合kk即可得出jj的变化。

#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;
}