3420. 括号序列
感觉打死我都不会
dp 在本子上
需要再看完全背包问题
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5010;
const int MOD = 1e9+7;
typedef long long LL;
int n;
char str[N];
LL f[N][N]; //都除以1e9+7了必然ll f[i][j]表示 前i个字符,左括号比右括号多f[i][j]个
LL work()
{
memset(f,0,sizeof f);
f[0][0] = 1;
for(int i=1;i<=n;i++)
{
if(str[i]=='(')
{
for(int j=1;j<=n;j++)
f[i][j] = f[i-1][j-1];
}
else
{
f[i][0] = (f[i - 1][1] + f[i - 1][0]) % 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];
return -1;
}
int main()
{
scanf("%s",str+1);
n = strlen(str+1);
LL l = work();
//翻转字符
reverse(str+1,str+1+n);
for(int i=1;i<=n;i++)
{
if(str[i]=='(') str[i] = ')';
else str[i] = '(';
}
LL r = work();
printf("%lld",(l*r) % MOD);
return 0;
}