90分,#14,#15TLE怎么办
查看原帖
90分,#14,#15TLE怎么办
957205
Frommyvalleyuphard楼主2025/7/19 10:22

注:本人码风较差,请谅解

#include<bits/stdc++.h>
using namespace std;
long long n,fk,dp[1000][1000][2],saf[1000],sun[1000],m=1000000007;
string s;
int main(){
	cin>>n>>fk>>s;
	for(long long j=0;j<n;j++){
		long long ck=n-1;
		for(long long l=j+1;l<=min(j+fk,n-1);l++){
			if(s[l]=='(' || s[l]==')'){
				ck=l-1;break;
			}
		}
		saf[j]=ck+1;
	}
	for(long long j=0;j<n-1;j++){
		if((s[j]=='?' || s[j]=='(')&&(s[j+1]=='?' || s[j+1]==')')){
			dp[j][j+1][0]=dp[j][j+1][1]=1;
		}
	}
	for(long long k=2;k<n;k++){
		for(long long l=0;l<n-k;l++){
			long long ch=0,r=l+k;
			if(s[l]==')' || s[l]=='*' || s[r]=='(' || s[r]=='*'){
				continue;
			}
			for(long long j=l+1;j<r;j++){
				if(s[j]!='*' && s[j]!='?'){
					ch=1;break;
				}
			}
			if(ch==0 && r-l-1<=fk){
				dp[l][r][0]=(dp[l][r][0]+1)%m,dp[l][r][1]=(dp[l][r][1]+1)%m;
			}
			for(long long r2=r-1;r2>max(l,r-fk-1);r2--){
				if(s[r2]!='*' && s[r2]!='?'){
					break;
				}else{
					dp[l][r][0]=(dp[l][r][0]+dp[l+1][r2-1][1])%m,dp[l][r][1]=(dp[l][r][1]+dp[l+1][r2-1][1])%m;
				}
			}
			for(long long l2=l+1;l2<min(r,l+fk+1);l2++){
				if(s[l2]!='*' && s[l2]!='?'){
					break;
				}else{
					dp[l][r][0]=(dp[l][r][0]+dp[l2+1][r-1][1])%m,dp[l][r][1]=(dp[l][r][1]+dp[l2+1][r-1][1])%m;
				}
			}
			dp[l][r][0]=(dp[l][r][0]+dp[l+1][r-1][1])%m,dp[l][r][1]=(dp[l][r][1]+dp[l+1][r-1][1])%m;
			for(long long l2=0;l2<n;l2++){
				sun[l2]=0;
			}
			for(long long l2=l+1;l2<r;l2++){
				sun[l2]=(sun[l2-1]+dp[l2][r][0])%m;
			}
			for(long long l2=l+1;l2<r;l2++){
				dp[l][r][1]=(dp[l][r][1]+dp[l][l2][1]*((sun[min(saf[l2],min(l2+fk+1,r-1))]-sun[l2]+m)%m)%m)%m;
			}
		}
	}
	cout<<dp[0][n-1][1];
}

帮帮我吗?我写了1天了

2025/7/19 10:22
加载中...