题目链接 Coloring Brackets

考虑树型DP。(我参考了Q巨的代码还是略不理解……)

首先在序列的最外面加一对括号。预处理出DFS树。

每个点有9中状态。假设0位不涂色,1为涂红色,2为涂蓝色。

0:0 0

1:0 1

2:0 2

3:1 0

4:1 1

5:1 2

6:2 0

7:2 1

8:2 2

其中1、2、3、6为有效的状态。

DP的时候如果当前括号下没有子括号那么这个状态方案数为1。

先处理出第一对括号。然后处理接下来的括号。

拼接的时候如果出现()() 中间两个括号同时染色并且颜色相同那么该状态不合法,跳过。

转移的时候滚动一下。

如果当前节点不是根的话那么最后处理的时候只保留合法的状态。

 #include <bits/stdc++.h>

 using namespace std;

 #define LL long long

 const int valid[] = {,,,};
const LL mod = ;
const int root = ; char s[];
vector <int> e[];
stack <int> stk;
LL f[][];
int n, ret, tot; void dfs(int u){
f[u][] = ;
LL tmp[];
for (int i = , flag = ; i < (int)e[u].size(); i++){
int v = e[u][i];
dfs(v);
if (!flag){
for (int tk = (f[u][] = ); tk < ; ++tk){
int k = valid[tk];
f[u][k] = f[v][k];
} flag = ;
} else{
for (int j = ; j < ; ++j) tmp[j] = ;
for (int j = ; j < ; ++j)
for (int tk = ; tk < ; ++tk){
int k = valid[tk];
int cl[] = {j / , j % }, cr[] = {k / , k % };
if (cl[] > && cr[] > && cl[] == cr[]) continue;
int p = cl[] * + cr[];
(tmp[p] += 1LL * f[u][j] * f[v][k]) %= mod;
} for (int j = ; j < ; ++j) f[u][j] = tmp[j];
}
} if (u != root){
for (int j = ; j < ; ++j) tmp[j] = ;
for (int j = ; j < ; ++j)
for (int tk = ; tk < ; ++tk){
int k = valid[tk];
int ci[] = {j / , j % }, co[] = {k / , k % };
if ((ci[] > && co[] > && ci[] == co[])
|| (ci[] > && co[] > && ci[] == co[])) continue;
(tmp[k] +=f[u][j]) %= mod;
}
for (int j = ; j < ; ++j) f[u][j] = tmp[j];
}
} int main(){ scanf("%s", s + );
n = strlen(s + ); tot = ;
s[] = '(', s[n + ] = ')';
for (int i = ; s[i]; ++i){
if (s[i] == '('){
if (tot) e[stk.top()].push_back(tot);
stk.push(tot++);
} else stk.pop();
} dfs(root);
ret = ;
for (int i = ; i < ; ++i) (ret += f[root][i]) %= mod;
return * printf("%d\n", ret);
}

Codeforces 149D Coloring Brackets(树型DP)的更多相关文章

  1. CodeForces 149D Coloring Brackets (区间DP)

    题意: 给一个合法的括号序列,仅含()这两种.现在要为每对括号中的其中一个括号上色,有两种可选:蓝or红.要求不能有两个同颜色的括号相邻,问有多少种染色的方法? 思路: 这题的模拟成分比较多吧?两种颜 ...

  2. codeforces 149D Coloring Brackets (区间DP + dfs)

    题目链接: codeforces 149D Coloring Brackets 题目描述: 给一个合法的括号串,然后问这串括号有多少种涂色方案,当然啦!涂色是有限制的. 1,每个括号只有三种选择:涂红 ...

  3. CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)

    1.http://codeforces.com/problemset/problem/149/D 2.题目大意 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色, ...

  4. CodeForces 149D Coloring Brackets

    Coloring Brackets time limit per test: 2 seconds memory limit per test: 256 megabytes input: standar ...

  5. CodeForces 149D Coloring Brackets 区间DP

    http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...

  6. Codeforces 23E Tree(树型DP)

    题目链接 Tree $dp[x][i]$表示以x为根的子树中x所属的连通快大小为i的时候 答案最大值 用$dp[x][j]$ * $dp[y][k]$ 来更新$dp[x][j + k]$. (听高手说 ...

  7. Codeforces 581F Zublicanes and Mumocrates(树型DP)

    题目链接  Round 322 Problem F 题意  给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...

  8. 【题解】codeforces 219D Choosing Capital for Treeland 树型dp

    题目描述 Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市.每条道路只能单向通行.现在政府需要决定选择哪个城市为首都.假如城市i成为了首都,那么为了使首都能到达任意一 ...

  9. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

随机推荐

  1. 如何用纯 CSS 创作一个过山车 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KBxYZg/ 可交互视频 此视频是 ...

  2. GOPATH和GOROOT

    安装指定版本golang apt-get purge golang* //删除之前安装的文件 add-apt-repository ppa:evarlast/golang-1.8 apt-get up ...

  3. python日记整理

    都是自己的学习总结,要是总结的有问题大佬麻烦评价一下我好修改,谢谢 python插件插件+pycharm基本用法+markdown文本编写+jupyter notebook的基本操作汇总 一.计算机基 ...

  4. Java Web系统常用的第三方接口

    1.    Web Service 接口 1.1 接口方式说明和优点 在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为客户端去调用第三方提供的接口时,大部分时候都是使用 Web  Se ...

  5. 《Nginx高性能Web服务器详解》

    第1章 Nginx初探 第2章 Nginx服务器的安装部署 第3章 Nginx服务器架构初探 第4章 Nginx服务器的高级设置 第5章 Nginx服务器的Gzip压缩 第6章 Nginx服务器的Re ...

  6. Python_Virtualenv及Pycharm配置

    Virtualenv存在的意义 在Python使用过程中,你是否有遇到过同时需要开发多个应用的情况? 假设A应用需要使用DJango1.X版本,而B应用需要使用DJango2.X的版本,而你全局开发环 ...

  7. Python日志记录(Logging)

    日志记录跟程序的测试相关,并且在大幅度更改程序内核时很有用,它可以帮助我们找到问题和错误的所在.日志记录基本上就是收集与程序运行有关的数据,这样可以在随后进行检查或者累计数据. 1.简单示例 在Pyt ...

  8. 【Luogu】P4363一双木棋(状压爆搜)

    题目链接 唉,只有AC了这道题才会感叹考场上没有想出解法的我是多么智障. 我甚至连任何想法都没有. 天啊我当时到底在想些什么. AC这道题我就能进前15了诶. 我们发现只要确定了轮廓线那么此时的状态就 ...

  9. BZOJ4176 Lucas的数论 【莫比乌斯反演 + 杜教筛】

    题目 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N", ...

  10. java中String初始化的两种方式

    转自:http://www.diybl.com/course/3_program/java/javajs/2007104/75886.html       字符串可能是任何程序语言中都会出现的对象,j ...