不是特别理解,譬如()时答案是1但是过评测机是没问题的。
可能给出的数据都是至少需要添加一个。
代码是照猫画虎写了一份,似懂非懂。
首先()等价,不可能让你加一个()这种匹配的,所以答案是两者乘积
处理一个,另一个倒转再相同处理即可
先处理加(的情况
dp[i][j]表示第i个字符(比)多j个的添加方法数
转移方程:
当前为(:f[i][j]=f[i-1][j-1]这时我们不加(因为加在哪都一样所以我们统一加载)左侧
当前为):f[i][j]=(f[i-1][j+1]+f[i][j-1])%mod f[i-1][j+1]加上)后变为f[i][j],所以他是初始状态,加上一个(在)左侧那么f[i][j]就由f[i][j-1]转化而来
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod=1e9+7;
ll f[5050][5050],n;
char ch[5050];
ll sol(){
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=n;i++){
if(ch[i-1]=='(')
{for(int j=1;j<=n;j++)f[i][j]=f[i-1][j-1];}
else {
f[i][0]=(f[i-1][0]+f[i-1][1])%mod;
for(int j=1;j<=n;j++)f[i][j]=(f[i-1][j+1]+f[i][j-1])%mod;
}
}
for(int i=0;i<=n;i++)
if(f[n][i])return f[n][i];
}
int main()
{
scanf("%s",ch);
n=strlen(ch);
ll l=sol();
reverse(ch,ch+n);
for(int i=0;i<n;i++){
if(ch[i]=='(')ch[i]=')';
else ch[i]='(';
}
ll r=sol();
printf("%lld\n",(l*r)%mod);
return 0;
}