25pts求助
查看原帖
25pts求助
149933
Zero_Legend楼主2021/10/27 11:14

O(n4)O(n^4)算法,预计65pts但实际只有25pts

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=510;
const int MOD=1e9+7;
int n,k;
string s;
int g[N][N],f[N][N];
int c[N][N];
//g[i][j]表示序列两端不匹配的方案数
//f[i][j]表示序列两边匹配的方案数

void prework(){
	for(int i=1;i<=n;i++) c[i][i-1]=1;
	for(int i=1;i<=n;i++) if(s[i]=='*'||s[i]=='?') c[i][i]=1;
	for(int len=2;len<=n;len++){
		for(int l=1;l+len-1<=n;l++){
			int r=l+len-1;
			if(c[l][r-1]&&(s[r]=='*'||s[r]=='?')) c[l][r]=1;
		}
	}
}

signed main(){
	cin>>n>>k>>s;
	s=" "+s;
	prework();
	for(int len=2;len<=n;len++){
		for(int l=1;l+len-1<=n;l++){
			int r=l+len-1;
			if((s[l]!='('&&s[l]!='?')||(s[r]!=')'&&s[r]!='?')) continue;
			if(l+1==r){f[l][r]=1;continue;}
			f[l][r]=(f[l][r]+f[l+1][r-1]+g[l+1][r-1])%MOD;//(A)
			if(c[l+1][r-1]) f[l][r]=(f[l][r]+1)%MOD;//(S)
			for(int i=l+2;i<=r-2;i++) if(r-i-1<=k&&c[i+1][r-1]) f[l][r]=(f[l][r]+(f[l+1][i]+g[l+1][i])%MOD)%MOD;//(AS)
			for(int i=l+2;i<=r-2;i++) if(i-l-1<=k&&c[l+1][i-1]) f[l][r]=(f[l][r]+(f[i][r-1]+g[i][r-1])%MOD)%MOD;//(SA)
			for(int i=l+1;i<=r-1;i++){
				for(int j=i+1;j<=r-1;j++){
					if(j-i-1<=k&&c[i+1][j-1]) g[l][r]=(g[l][r]+(f[l][i]+g[l][i])*f[j][r]%MOD)%MOD;//(ASB)
				}
			}
		}
	}
	int ans=(f[1][n]+g[1][n])%MOD;
	cout<<ans;
	return 0;
}

2021/10/27 11:14
加载中...