社区讨论
样例2都过不去,求调
P7914[CSP-S 2021] 括号序列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m20h2wbe
- 此快照首次捕获于
- 2024/10/08 21:24 去年
- 此快照最后确认于
- 2025/11/04 17:37 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=105,mod=1e9+7;
int n,m;
char a[N];
int f[N][N][6];
bool eq(int i,char x){
if(a[i]=='?'||a[i]==x)return 1;
return 0;
}
signed main(){
cin>>n>>m;
if(n==1){cout<<0;return 0;}
scanf("%s",a+1);
if(n==2){if(eq(1,'(')&&eq(2,')'))cout<<1;else cout<<0;return 0;}
for(int i=1;i<=n;i++){
if(eq(i,'*'))f[i][i][3]=1;
if(eq(i,'*')&&eq(i+1,'*')&&2<=m)f[i][i+1][3]=1;
if(eq(i,'(')&&eq(i+1,')'))f[i][i+1][0]=f[i][i+1][4]=1;
}
for(int len=3;len<=n;len++){
for(int i=1,j=i+len-1;i<=n&&j<=n;i++,j++){
if(eq(i,'(')&&eq(j,')'))f[i][j][0]=(f[i+1][j-1][1]+f[i+1][j-1][2]+f[i+1][j-1][3]+f[i+1][j-1][4])%mod;
for(int k=i;k<=j-1;k++)f[i][j][0]=(f[i][j][0]+f[i][k][5]*f[k+1][j][0])%mod;
for(int k=i;k<=j-1;k++)f[i][j][1]=(f[i][j][1]+f[i][k][3]*f[k+1][j][4])%mod;
for(int k=i;k<=j-1;k++)f[i][j][2]=(f[i][j][2]+f[i][k][4]*f[k+1][j][3])%mod;
if(len<=m)f[i][j][3]=f[i][j-1][3]*f[j][j][3]%mod;
f[i][j][4]=f[i][j][0];
for(int k=i;k<=j-1;k++)f[i][j][4]=(f[i][j][4]+f[i][k][4]*f[k+1][j][0])%mod;
for(int k=i;k<=j-1;k++)f[i][j][5]=(f[i][j][5]+f[i][k][0]*f[k+1][j][3])%mod;
}
}
cout<<f[1][n][4]<<"\n";
return 0;
}
/*
A表示从中间断开就不对的超级括号序列
S表示一堆*
0:A*A*A (可能只有一个A)
1:SAAAA
2:AAAAS
3:S
4:AAAA(可能只有一个A)
5:AS (只有一个A)
*/
不知道哪里算重了,第二个样例输出20。
DP第三维含义在最后注释
回复
共 0 条回复,欢迎继续交流。
正在加载回复...