社区讨论
求助这个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 条回复,欢迎继续交流。
正在加载回复...