首页 > 其他分享 >D. Coloring Brackets

D. Coloring Brackets

时间:2024-08-10 19:49:49浏览次数:14  
标签:... Coloring Brackets int 705 long match dp

原题链接

题解

首先,假设当前 \(s(l,r)\) 括号序列为合法序列,则有如下几种情况:

  • \(l+1==r\) ()

  • \(match[r]==l\) (...)

  • \(match[r]!=l\) (...)...(...)

code

#include<bits/stdc++.h>
using namespace std;

const long long MOD = 1e9+7;

long long dp[705][705][3][3] = {0};
int match[705];

void dfs(int l, int r) {
    if (l + 1 == r) {
        dp[l][r][0][1] = dp[l][r][1][0] = dp[l][r][0][2] = dp[l][r][2][0] = 1;
        return;
    }

    if (match[r] == l) {
        dfs(l + 1, r - 1);

        for (int i = 0; i <= 2; i++) {
            for (int j = 0; j <= 2; j++) {
                if (j != 1) dp[l][r][0][1] = (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % MOD;
                if (i != 1) dp[l][r][1][0] = (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % MOD;
                if (j != 2) dp[l][r][0][2] = (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % MOD;
                if (i != 2) dp[l][r][2][0] = (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % MOD;
            }
        }
        return;
    }

    int r1 = match[r] - 1, l1 = match[r];
    dfs(l, r1);
    dfs(l1, r);

    for (int i = 0; i <= 2; i++) {
        for (int j = 0; j <= 2; j++) {
            for (int k = 0; k <= 2; k++) {
                for (int m = 0; m <= 2; m++)
                {
                    if(j==1&&k==1||j==2&&k==2) continue;
                    //if(i==j||i&&j) continue;if(k==m||k&&m) continue;这个要注释掉是因为另外半部分的外围括号可能不是配对的
                    dp[l][r][i][m] = (dp[l][r][i][m] + dp[l][r1][i][j] * dp[l1][r][k][m] % MOD) % MOD;
                }
            }
        }
    }
}

void solve() {
    string s;
    cin >> s;
    int n = s.size();
    stack<int> q;

    for (int i = 0; i < n; i++) {
        if (s[i] == ')') {
            match[i] = q.top();
            q.pop();
        } else {
            q.push(i);
        }
    }

    dfs(0, n - 1);


    long long ans = 0;
    for (int i = 0; i <= 2; i++) {
        for (int j = 0; j <= 2; j++) {
            ans = (ans + dp[0][n - 1][i][j]) % MOD;
        }
    }

    cout << ans << '\n';
}

signed main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int TT = 1;
    // cin >> TT;
    while (TT--) solve();
    return 0;
}

标签:...,Coloring,Brackets,int,705,long,match,dp
From: https://www.cnblogs.com/pure4knowledge/p/18352715

相关文章

  • D. Cross Coloring
    原题链接题解设想每一个\(x,y\)代表中控台,中控台颜色改变它控制的颜色也会跟着改变,我们倒过来求,这样就能确保每个中控台有没有控制的颜色code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;constllmod=998244353;llxs[200005]={0};llys[200005]......
  • Coloring Edges
    \(Solution\)link一个经典结论是有向图中的任意一个环总能由一条生成树上的从祖先到儿子的链以及一条返祖边组成,正确性显然。不妨将所有树边和横插边都染成黑色,返祖边染成白色,这样就可以保证任意一个环都有两种颜色了。判断横插边和返祖边可以用栈来维护。#include<bits/std......
  • CF111D Petya and Coloring 题解
    很明显这是一道组合题。首先特判一下,当\(m=1\)时,答案就是\(k^n\)。对于\(m>1\)的情况,我们可以得出一个结论:对于沿格子的线穿过的任何垂直线,会将棋盘分成两个非空的部分,这两个部分中的不同颜色的数量相同且总是不变。设这个不同颜色的数量为\(i\),那么左边这部分的颜色一定......
  • 题解 CF1781G Diverse Coloring
    \(\texttt{link}\)题意给定一棵\(n\)个点的二叉树,现对其每个点染成黑色或白色。一种合法的染色方案满足:对于所有黑色的点,都存在白色的点与之相邻。对于所有白色的点,都存在黑色的点与之相邻。一种染色方案的权值是染成黑色的点数与染成白色的点数之差的绝对值。\(\foral......
  • Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)
    思路:分类讨论:当一个数字出现的次数大于等于k,那么最多有k个能被染色,当一个数字出现的次数小于k,南那么这些数字都可能被染色还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小于k的所有数字的出现次数总和为sum,将所有这些数字排序后,前sum-sum%k个数字是都可以......
  • [Codeforces] CF1774B Coloring
    CF1774BColoring题意Cirno_9baka的纸条上有\(n\)个格子,他觉得空白的纸条看着有点无趣,于是想在纸条的格子上涂上\(m\)种颜色。同时,他认为第\(i\)种颜色必须要用\(a_i\)次,且每连续\(k\)个格子里涂的颜色必须互不相同。Cirno_9baka想知道有没有这样的一种涂色方案能......
  • 题解 CF1887E【Good Colorings】
    萌萌交互题。对网格图进行二分图建模,左部\(n\)个点表示每一行,右部\(n\)个点表示每一列。若格子\((i,j)\)被染成\(c\)色,就连接\((L_i,R_j,c)\)的边。由抽屉原理易证,在初始局面中至少有一个各边颜色均不同的偶环。获胜条件相当于存在一个各边颜色均不同的四元环。讨论......
  • CF1592F2 Alice and Recoloring 2
    题意给定一个矩阵,有两种颜色\(W\)和\(B\)。你可以花\(1\)的代价反转一个包含\((1,1)\)的矩阵。你可以花\(3\)的代价反转一个包含\((n,1)\)的矩阵。你可以花\(4\)的代价反转一个包含\((1,m)\)的矩阵。你可以花\(2\)的代价反转一个包含\((n,m)\)的矩阵......
  • [CF1592F2] Alice and Recoloring 2
    题目链接操作2和3可以用另两个代替,没有任何用。设W表示\(t_{i,j}=0\),B表示\(t_{i,j}=1\)考虑差分。设\(t_{i,j}=s_{i,j}\opluss_{i+1,j}\opluss_{i,j+1}\opluss_{i+1,j+1}\),那么目标变为把$t4数组清0那么操作1是把单点翻转,操作4是对于一个\(x,y(x<n,y<m)......
  • 软件测试|好用的pycharm插件推荐(三)——Rainbow Brackets
    简介我们平时写代码的时候,括号是让我们非常头疼的地方,特别是代码逻辑很多,层层嵌套的情况。一眼很难看出,代码是从哪个括号开始,到哪个反括号结束的。这个时候要是有一款工具能够让我们一眼就看出代码从哪个括号开始,到哪个反括号结束,无疑对我们会有很大帮助。PyCharmRainbowBra......