0分求助
查看原帖
0分求助
638718
xueruo楼主2022/10/22 22:12
#include<iostream>
#include<cstring>
using namespace std;
const int mod=1e9+7;
const int Max=1000;
string s;
long long ans,f[Max][Max],l,r,
n,k,t[Max][Max],g[Max][Max];//g是不匹配的,f是匹配
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>s[i];
	}
	l=1,r=n;//r-l-1<=k&&j-i-1<=r&&l<i<j<r
	if(s[l]=='*'||s[r]=='*'){
		cout<<ans;
		return 0;
	}
	//预处理'*'->t
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(s[j]=='*'||s[j]=='?'){
				t[i][j]++;
			}else{
				break;
			}
		}
	}
	//预处理len=2
	for(l=1;l<=n-1;l++){
		r=l+1;
		if((s[l]=='?'||s[l]=='(')&&(s[r]==')'||s[r]=='?')){
			f[l][r]=1;
		}
	}
	for(int p=3;p<=n;p++){
		for(int len=3;len<=n;len++){
			for(l=1;l<=n-len+1;l++){//(S)
				r=l+len-1;
				if(r-l-1<=k){
					f[l][r]+=t[l+1][r-1];
				}
			}
			for(int i=1;i<=r;i++){//AB,ASB   ((*)(**))
				for(int j=1;j<=r;j++){
					if(l<i&&i<j&&j<r&&j-i-1<=k){
						if(j==i+1){
							g[l][r]+=(f[l][i]+g[l][r])*f[j][r];
						}else{
							g[l][r]+=(f[l][i]+g[l][r])*f[j][r]*t[i+1][j-1];
						}
					}
				}
			}
			for(int i=l;i<=r;i++){//A
				for(int j=r;j>=l;j--){
					if(l<i&&i<j&&j<r&&j-i-1<=k){
						g[l][r]+=f[l+1][r-1]+g[l+1][r-1];
					}
				}
			}
			for(int i=l;i<=k;i++){//SA
				r=l+p+1;
				f[l][r]+=(f[l+i+1][r-1]+g[l][l+p+1])*t[l+1][l+i];
			}
			for(int i=1;i<=k;i++){//AS
				f[l][r]+=(f[l+1][r-i-1]+g[l+1][r-i-1])*t[r-i][r-1];
			}
		}
	}
	for(int i=1;i<=n;i++){
		ans+=(f[1][n]+g[1][n]);
	}
	cout<<ans;
	return 0;
}
//1 ≤ k ≤ n ≤ 500
/*in
7 3
(*??*??
out
5*/
2022/10/22 22:12
加载中...