社区讨论

样例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 条回复,欢迎继续交流。

正在加载回复...