Codeforces 149D Coloring Brackets(树型DP)
题目链接 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)的更多相关文章
- CodeForces 149D Coloring Brackets (区间DP)
题意: 给一个合法的括号序列,仅含()这两种.现在要为每对括号中的其中一个括号上色,有两种可选:蓝or红.要求不能有两个同颜色的括号相邻,问有多少种染色的方法? 思路: 这题的模拟成分比较多吧?两种颜 ...
- codeforces 149D Coloring Brackets (区间DP + dfs)
题目链接: codeforces 149D Coloring Brackets 题目描述: 给一个合法的括号串,然后问这串括号有多少种涂色方案,当然啦!涂色是有限制的. 1,每个括号只有三种选择:涂红 ...
- CF 149D Coloring Brackets(区间DP,好题,给配对的括号上色,求上色方案数,限制条件多,dp四维)
1.http://codeforces.com/problemset/problem/149/D 2.题目大意 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色, ...
- CodeForces 149D Coloring Brackets
Coloring Brackets time limit per test: 2 seconds memory limit per test: 256 megabytes input: standar ...
- CodeForces 149D Coloring Brackets 区间DP
http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...
- Codeforces 23E Tree(树型DP)
题目链接 Tree $dp[x][i]$表示以x为根的子树中x所属的连通快大小为i的时候 答案最大值 用$dp[x][j]$ * $dp[y][k]$ 来更新$dp[x][j + k]$. (听高手说 ...
- Codeforces 581F Zublicanes and Mumocrates(树型DP)
题目链接 Round 322 Problem F 题意 给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...
- 【题解】codeforces 219D Choosing Capital for Treeland 树型dp
题目描述 Treeland国有n个城市,这n个城市连成了一颗树,有n-1条道路连接了所有城市.每条道路只能单向通行.现在政府需要决定选择哪个城市为首都.假如城市i成为了首都,那么为了使首都能到达任意一 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
随机推荐
- 如何用纯 CSS 创作一个过山车 loader
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KBxYZg/ 可交互视频 此视频是 ...
- GOPATH和GOROOT
安装指定版本golang apt-get purge golang* //删除之前安装的文件 add-apt-repository ppa:evarlast/golang-1.8 apt-get up ...
- python日记整理
都是自己的学习总结,要是总结的有问题大佬麻烦评价一下我好修改,谢谢 python插件插件+pycharm基本用法+markdown文本编写+jupyter notebook的基本操作汇总 一.计算机基 ...
- Java Web系统常用的第三方接口
1. Web Service 接口 1.1 接口方式说明和优点 在笔者的开发生涯中,当作为接口提供商给第三方提供接口时,以及作为客户端去调用第三方提供的接口时,大部分时候都是使用 Web Se ...
- 《Nginx高性能Web服务器详解》
第1章 Nginx初探 第2章 Nginx服务器的安装部署 第3章 Nginx服务器架构初探 第4章 Nginx服务器的高级设置 第5章 Nginx服务器的Gzip压缩 第6章 Nginx服务器的Re ...
- Python_Virtualenv及Pycharm配置
Virtualenv存在的意义 在Python使用过程中,你是否有遇到过同时需要开发多个应用的情况? 假设A应用需要使用DJango1.X版本,而B应用需要使用DJango2.X的版本,而你全局开发环 ...
- Python日志记录(Logging)
日志记录跟程序的测试相关,并且在大幅度更改程序内核时很有用,它可以帮助我们找到问题和错误的所在.日志记录基本上就是收集与程序运行有关的数据,这样可以在随后进行检查或者累计数据. 1.简单示例 在Pyt ...
- 【Luogu】P4363一双木棋(状压爆搜)
题目链接 唉,只有AC了这道题才会感叹考场上没有想出解法的我是多么智障. 我甚至连任何想法都没有. 天啊我当时到底在想些什么. AC这道题我就能进前15了诶. 我们发现只要确定了轮廓线那么此时的状态就 ...
- BZOJ4176 Lucas的数论 【莫比乌斯反演 + 杜教筛】
题目 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i<=N", ...
- java中String初始化的两种方式
转自:http://www.diybl.com/course/3_program/java/javajs/2007104/75886.html 字符串可能是任何程序语言中都会出现的对象,j ...