没过样例 2 且 5pts 求助
查看原帖
没过样例 2 且 5pts 求助
203008
山田リョウ楼主2022/9/21 21:22
#include<stdio.h>
int n,K,f1[501][501],f2[501][501],f3[501][501],f4[501][501];char s[502];
const int p=1000000007;
inline int sum(int x,int y){
	return p-x>y?x+y:y-(p-x);
}
inline int pro(int x,int y){
	return (long long)x*y%p;
}
int main(){
	fscanf(stdin,"%d%d",&n,&K);
	fgetc(stdin),fgets(s+1,501,stdin);
	for(int i=1;i<=n;++i)f2[i][i-1]=1;
	for(int l=2;l<=n;++l)
		for(int i=1,j=l;j<=n;++i,++j)
			if(s[j]==')'||s[j]=='?'){
				if(s[i]=='('||s[i]=='?'){
					f1[i][j]=f2[i+1][j-1];
					for(int k=i+1;k<=i+K+1&&k<j-1;++k){if(s[k]!='*'&&s[k]!='?')break;f1[i][j]=sum(f1[i][j],f2[k+1][j-1]);}
					for(int k=j-1;k>=j-K-1&&k>i+1;--k){if(s[k]!='*'&&s[k]!='?')break;f1[i][j]=sum(f1[i][j],f2[i+1][k-1]);}
					if(2<l&&l<=K+2){
						int flag=1;
						for(int k=i+1;k<j;++k)if(s[k]!='*'&&s[k]!='?'){flag=0;break;}
						f1[i][j]+=flag;
					}
					f4[i][j]=f1[i][j];
					for(int k=i;k<j;++k)f4[i][j]=sum(f4[i][j],pro(f1[i][k],f4[k+1][j]));
					f2[i][j]=f4[i][j];
					for(int k=i;k<j;++k)f2[i][j]=sum(f2[i][j],pro(f4[i][k],f3[k+1][j]));
				}
				for(int k=0;k<K&&k<l-1;++k){if(s[i+k]!='*'&&s[i+k]!='?')break;f3[i][j]=sum(f3[i][j],f2[i+k+1][j]);}
//				printf("%d %d %d %d %d %d\n",i,j,f1[i][j],f2[i][j],f3[i][j],f4[i][j]);
			}
	printf("%d",f2[1][n]);
	return 0;
}
2022/9/21 21:22
加载中...