过不了样例求条
查看原帖
过不了样例求条
398152
MinimumSpanningTree最小生成树楼主2024/10/17 20:08

瞪了好久 没看出来有什么问题/kk

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll MOD=1e9+7;
const int N=510,M=10;
int n,k,r;
ll dp[N][N][M];
string s;
int main()
{
	cin>>n>>k>>s;
	s=" "+s;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j+i-1<=n;j++)
		{
			r=j+i-1;
			if(i<=k&&(dp[j][r-1][1]||i==1)&&(s[r]=='*'||s[r]=='?')) dp[j][r][1]=1;
			if(i>=2)
			{
                if((s[j]=='('||s[j]=='?')&&(s[r]==')'||s[r]=='?')) dp[j][r][2]=(dp[j+1][r-1][1]+dp[j+1][r-1][3]+dp[j+1][r-1][4]+dp[j+1][r-1][5])%MOD;
                for(int k=j;k<r;k++)
                {
                	dp[j][r][3]=(dp[j][r][3]+dp[j][k][4]*dp[k+1][r][1]%MOD)%MOD;
                	dp[j][r][4]=(dp[j][r][4]+(dp[j][k][3]+dp[j][k][4])*dp[k+1][r][2]%MOD)%MOD;
                	dp[j][r][5]=(dp[j][r][5]+dp[j][k][6]*dp[k+1][r][1]%MOD)%MOD;
                	dp[j][r][6]=(dp[j][r][6]+(dp[j][k][5]+dp[j][k][6])*dp[k+1][r][2]%MOD)%MOD;
				}
				dp[j][r][4]=(dp[j][r][4]+dp[j][r][2])%MOD;
				dp[j][r][5]=(dp[j][r][5]+dp[j][r][1])%MOD;
            }
            //printf("%d %d %d\n",j,r,dp[j][r][4]); 
        }
	}
	printf("%lld",dp[1][n][4]);
	return 0;
}
2024/10/17 20:08
加载中...