社区讨论

求助这个DP状态为什么不对

P7914[CSP-S 2021] 括号序列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo176vqp
此快照首次捕获于
2023/10/22 16:19
2 年前
此快照最后确认于
2023/11/02 15:57
2 年前
查看原帖
跟第一篇题解类似,但是只有四种状态
1:合法状态
2:**串+合法序列
3:合法序列+**串
4:**串
附代码
CPP
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int mod = 1e9 + 7;
int n, K, dp[501][501][10], a[501];
char s[501];
bool pan(int l, int r){
	if (s[l] == '(' || s[l] == '?'){
		if (s[r] == ')' || s[r] == '?') return true;
	}
	return false;
}
bool p2(int l, int r){
	if (a[r] - a[l - 1] == r - l + 1 && r - l + 1 <= K) return true;
	return false;
}
int main(){
	scanf("%d%d", &n, &K);
	scanf("%s", s + 1);
	for (int i = 1; i <= n; i++){
		if (s[i] == '*' || s[i] == '?') a[i] = 1;
		a[i] += a[i - 1];
		if (s[i] == '*' || s[i] == '?') dp[i][i][4] = 1;
	}
	for (int i = 1; i <= n; i++){
		if (i != n && pan(i, i + 1)) dp[i][i + 1][1] = 1;
		if (p2(i, i + 1)) dp[i][i + 1][4] = 1;
//		pr intf("%d ", a[i]);
	}
	int r;
	for (int len = 2; len <= n; len++){
		for (int l = 1; l + len <= n; l++){
			r = l + len;
//			printf("%d %d\n", l, r);
			if (p2(l, r)) dp[l][r][4] = 1;
			if (pan(l, r)){
//				printf("%d ", dp[l + 1][r - 1][4]);
				dp[l][r][1] = (dp[l + 1][r - 1][1] + dp[l + 1][r - 1][2] + dp[l + 1][r - 1][3] + dp[l + 1][r - 1][4]) % mod;
			}
			for (int k = l; k < r; k++){
				dp[l][r][1] = (dp[l][r][1] + dp[l][k][1] * dp[k + 1][r][2]) % mod;
				dp[l][r][1] = (dp[l][r][1] + dp[l][k][1] * dp[k + 1][r][1]) % mod;
				dp[l][r][2] = (dp[l][r][2] + dp[l][k][4] * dp[k + 1][r][1]) % mod;
				dp[l][r][3] = (dp[l][r][3] + dp[l][k][1] * dp[k + 1][r][4]) % mod;
			}
		}
	}
	printf("%d\n", dp[1][n][1]);
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...