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;
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9464384.html