社区讨论
样例未过求助
P7914[CSP-S 2021] 括号序列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjpreb61
- 此快照首次捕获于
- 2025/12/28 21:22 2 个月前
- 此快照最后确认于
- 2026/01/01 11:55 2 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
const int QWQ = 1005;
string s;
int n, k, dp[QWQ][QWQ][5], f[QWQ][QWQ];
signed main()
{
cin >> n >> k >> s;
s = " " + s;
for (int i = 1; i <= n; i++)
{
if (s[i] == '*' || s[i] == '?')
{
dp[i][i][1] = 1;
f[i][i] = 1;
}
for (int j = i; j <= n && j - i + 1 <= k; j++)
{
if (f[i][j - 1] && (s[j] == '*' || s[j] == '?'))
{
f[i][j] = 1;
dp[i][j][1] = 1;
}
}
}
for (int len = 2; len <= n; len++)
{
for (int l = 1; l + len - 1 <= n; l++)
{
int r = l + len - 1;
if (len <= k && f[l][r])
{
dp[l][r][1] = 1;
}
if ((s[l] == '(' || s[l] == '?') && (s[r] == ')' || s[r] == '?'))
{
if (len == 2)
{
dp[l][r][2] = (dp[l][r][2] + 1) % mod;
}
if (len > 2)
{
dp[l][r][2] = (dp[l][r][2] + dp[l + 1][r - 1][0]) % mod;
}
for (int mid = l + 1; mid < r - 1 && mid - l <= k; mid++)
{
if (f[l + 1][mid])
{
dp[l][r][2] = (dp[l][r][2] + dp[mid + 1][r - 1][0]) % mod;
}
}
for (int mid = r - 1; mid > l + 1 && r - mid <= k; mid--)
{
if (f[mid][r - 1])
{
dp[l][r][2] = (dp[l][r][2] + dp[l + 1][mid - 1][0]) % mod;
}
}
}
dp[l][r][0] = (dp[l][r][0] + dp[l][r][2]) % mod;
for (int mid = l; mid < r; mid++)
{
dp[l][r][0] = (dp[l][r][0] + dp[l][mid][0] * dp[mid + 1][r][0] % mod) % mod;
}
for (int qwq = l; qwq < r; qwq++)
{
for (int qaq = qwq + 1; qaq < r && qaq - qwq <= k; qaq++)
{
if (f[qwq + 1][qaq])
{
dp[l][r][0] = (dp[l][r][0] + dp[l][qwq][0] * dp[qaq + 1][r][0] % mod) % mod;
}
}
}
for (int mid = l; mid < r && mid - l + 1 <= k; mid++)
{
if (f[l][mid])
{
dp[l][r][3] = (dp[l][r][3] + dp[mid + 1][r][0]) % mod;
}
}
for (int mid = r; mid > l && r - mid + 1 <= k; mid--)
{
if (f[mid][r])
{
dp[l][r][4] = (dp[l][r][4] + dp[l][mid - 1][0]) % mod;
}
}
}
}
cout << dp[1][n][0] << endl;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...