1 solutions

  • 0
    @ 2026-8-27 21:58:35

    100pts

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=510,MOD=1e9+7;
    int n,m;
    char s[N];
    LL f[N][N][5];
    /*
    
    合法序列状态 
    f[i][j][0]  (...)表示单独的 A          0=(0+1+2+3+4)
    f[i][j][1]  ()...()表示并列的 AB/ASB   1=(求和 0+1+3)X0
    f[i][j][2]  *****                      2=2
    f[i][j][3]  ()...()...   AS            3=(求和0+1)*2
    f[i][j][4]  ....()..()   SA            4=求和2x(0+1) 
    */
    bool is_match(char a,char b)
    {
    	return a==b||a=='?';	
    } 
    int main()
    {
    	cin>>n>>m;
    	cin>>s;
    	for(int len=1;len<=n;len++)
    	{
    		for(int i=0;i+len-1<n;i++)
    		{
    			int j=i+len-1;
    			if(len==1) //一个* 
    			{
    				if(is_match(s[i],'*'))
    				{
    					f[i][j][2]=1;
    				}
    			}
    			else
    			{
    				if(is_match(s[i],'(')&&is_match(s[j],')'))
    				{
    					if(len==2) //两个的时候 
    					{
    						f[i][j][0]=1;
    					}
    					for(int k=0;k<5;k++)
    					{
    						f[i][j][0]=(f[i][j][0]+f[i+1][j-1][k])%MOD; //累加不同状态的所有方案 
    					}
    				}
    				if(len<=m&&is_match(s[i],'*')) //说明是s 
    				{
    					f[i][j][2]=f[i+1][j][2]; //连续的一段 
    				}
    				for(int k=i;k<j;k++) //枚举分界点 
    				{
    					auto t=f[i][j],l=f[i][k],r=f[k+1][j];
    					t[1]=(t[1]+(l[0]+l[1]+l[3])*r[0])%MOD;
    					t[3]=(t[3]+(l[0]+l[1])*r[2])%MOD;
    					t[4]=(t[4]+l[2]*(r[0]+r[1]))%MOD;
    				}
    			}
    		}
    	}
    	cout<<(f[0][n-1][0]+f[0][n-1][1])%MOD;
    	return 0;
    }
    

    Information

    ID
    1147
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    10
    Accepted
    1
    Uploaded By