JZOJ5804. 【2018.08.12提高A组模拟】简单的序列

性质:每个位置的前缀和必须大于0,总和=0.以此dp即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mod=1e9+7;
int n,m,f[2005][2005],ans,sum,mn=0x3f3f3f3f;
char s[100005];
int main() {
    freopen("bracket.in","r",stdin);
    freopen("bracket.out","w",stdout);
    scanf("%d%d%s",&n,&m,s+1);
    for(int i=1;i<=m;i++) {if(s[i]=='(') sum++;else sum--;mn=min(mn,sum);}
    f[0][0]=1;
    for(int i=1;i<=n-m;i++) {
        for(int j=0;j<=i;j++) {
            if(j)(f[i][j]+=f[i-1][j-1])%=mod;
            if(j<i-1)(f[i][j]+=f[i-1][j+1])%=mod;
        }
    }
    for(int i=-mn;i<=n-m;i++) {
        for(int j=-mn;j<=i;j++) {
            if(sum+j<=m+n-i)
            ans=(ans+1ll*f[i][j]*f[n-m-i][j+sum])%mod;
        }
    }
    cout<<ans;
}

猜你喜欢

转载自www.cnblogs.com/sdfzhsz/p/9464384.html