求查错
查看原帖
求查错
153274
ignited楼主2021/10/25 19:26
#include<bits/stdc++.h>
using namespace std;

const long long mod=1000000007;

int n,k;
char c[510];
long long f[510][510][6];
bool can[510][510];

int main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>c[i];
	
	for(int i=1;i<=n;i++)
	{
		bool tmp=1;
		for(int j=i;(j<=n)&&(j<=i+k-1);j++)
		{
			if(c[j]!='*'&&c[j]!='?') tmp=0;
			can[i][j]=tmp;
		}
	}
	
	for(int i=1;i<=n;i++) if(can[i][i]) f[i][i][5]=1;
	for(int i=1;i<n;i++)
	{
		if(can[i][i+1]) f[i][i+1][5]++;
		if((c[i]=='('||c[i]=='?')&&(c[i+1]==')'||c[i+1]=='?')) f[i][i+1][1]++;
	}
	
	for(int l=2;l<n;l++)
	for(int i=1;i+l<=n;i++)
	{
		int j=i+l;
		if((c[i]=='('||c[i]=='?')&&(c[j]==')'||c[j]=='?')) 
		{
			f[i][j][1]=(f[i+1][j-1][1]+f[i+1][j-1][2]+f[i+1][j-1][3]+f[i+1][j-1][4])%mod;
			if(can[i+1][j-1]) f[i][j][1]=(f[i][j][1]+1)%mod;
		}
		
		for(int p=i;p<j;p++)
		{
			f[i][j][2]=(f[i][j][2]+(f[i][p][1]+f[i][p][2]+f[i][p][3])%mod*f[p+1][j][1]%mod)%mod;
			f[i][j][3]=(f[i][j][3]+(f[i][p][1]+f[i][p][2])%mod*can[p+1][j]%mod)%mod;
			f[i][j][4]=(f[i][j][4]+(f[i][p][4]+f[i][p][5])%mod*f[p+1][j][1]%mod)%mod;
			f[i][j][5]=(f[i][j][5]+f[i][p][4]%mod*can[p+1][j]%mod)%mod;
		}
	}
	
	cout<<(f[1][n][1]+f[1][n][2])%mod<<endl;
	
	return 0;
}

f1f1是外面套着括号的合法方法数 f2f2含并列括号的合法方法数 f3f3是去掉右边一段星星后合法方法数 f4f4是去掉左边一段星星后合法方法数 5151是去掉左右两端星星后合法方法数

2021/10/25 19:26
加载中...