35pts求助
查看原帖
35pts求助
95780
a1589255859楼主2021/10/29 12:48
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[505][505],as[505][505],sa[505][505],s[505][505],aa[505][505];
const int md=1e9+7;
char ss[505];
int kk[505];
signed main()
{
	char c;
	int n,k1;
	cin>>n>>k1;
	for(int i=1;i<=n;++i)
	{
		c=getchar();
		if(c!='('&&c!=')'&&c!='*'&&c!='?'){i--;continue;}
		ss[i]=c;
		if(c!='('&&c!=')')kk[i]=kk[i-1]+1;
	}
	for(int i=n;i>=1;i--)
	{
		for(int j=min(k1,kk[i]);j>0;j--)
		{
			s[i-j+1][i]=1;
		}
	}
	for(int i=2;i<=n;++i)
	{
		for(int j=1;j<=n-i+1;j++)
		{
			int u=i+j-1;
			bool k=(ss[j]=='('||ss[j]=='?')&&(ss[u]==')'||ss[u]=='?');
			if(i==2)
			{
				a[j][u]=k;continue;//()
			}
			if(k)
			{
				a[j][u]+=s[j+1][u-1];//(s)
				a[j][u]+=a[j+1][u-1]+aa[j+1][u-1];//(a)
				a[j][u]+=as[j+1][u-1];//(as)
				a[j][u]+=sa[j+1][u-1];//(sa)
				for(int v=j+1;v<u-1;++v)
				{
					a[j][u]+=aa[j+1][v]*s[v+1][u-1]+s[j+1][v]*aa[v+1][u-1];
					a[j][u]%=md;
				}
			}
			for(int v=j;v<u;++v)
			{
				as[j][u]+=a[j][v]*s[v+1][u];
				as[j][u]%=md;
				sa[j][u]+=s[j][v]*a[v+1][u];
				sa[j][u]%=md;
				aa[j][u]+=a[j][v]*a[v+1][u];//ab
				aa[j][u]+=aa[j][v]*a[v+1][u];//ab
				aa[j][u]+=aa[j][v]*sa[v+1][u];//asb
				aa[j][u]+=a[j][v]*sa[v+1][u];//asb
				aa[j][u]%=md;
			}
		}
	}
	printf("%lld\n",a[1][n]+aa[1][n]);
	return 0;
}
//aa´úÖ¸µÄÊÇ"asa"Óë"ab" 
2021/10/29 12:48
加载中...