社区讨论

样例未过求助

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

正在加载回复...