1 solutions
-
0
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