求 Hack
查看原帖
求 Hack
882092
zMinYu楼主2023/6/7 22:35

滚动数组,只有 10 pts(这题数据是不是有误)

#include<bits/stdc++.h>
using namespace std;
const int N=5003,mod=1e9+7;
int n;
char s[N];
long long dp[3][N];
long long cal()
{
	memset(dp,0,sizeof dp);
	for(int i=1;i<=n;i++)
	{
		if(s[i]=='(') 
		{
			dp[i%2][0]=0;
			for(int j=1;j<=n;j++)
			{
				if(i-1==0&&j-1==0)
				dp[i%2][j]=1;
				else 
				dp[i%2][j]=dp[(i-1)%2][j-1]%mod;
			}
		}
		else
		{
			if(i==1)
			{
				dp[i%2][0]=(1+dp[(i-1)%2][1])%mod;
			}
			else
			dp[i%2][0]=(dp[(i-1)%2][0]+dp[(i-1)%2][1])%mod;
			for(int j=1;j<=n;j++)
				dp[i%2][j]=(dp[(i-1)%2][j+1]+dp[i%2][j-1])%mod;
		}
//		for(int j=0;j<=n;j++)
//		cout<<dp[i%2][j]<<" ";
//		puts("");
	} 
	int k=n%2;
	for(int i=0;i<=n;i++)
	if(dp[k][i]) return dp[k][i]%mod;
}
int main()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	long long ans1=cal();
	reverse(s+1,s+n+1);
	for(int i=1;i<=n;i++)
		if(s[i]=='(') s[i]=')';
		else s[i]='(';
	long long ans2=cal();
	printf("%lld",ans1*ans2%mod);
	return 0; 
}
2023/6/7 22:35
加载中...