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了. ...
随机推荐
- read design into DC memory
- solr配置中文分词器
配置IK分词器 在/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib目录中加入IK分词器的jar包 在/opt/solr-7.7.1/serve ...
- CF1029C Maximal Intersection
https://www.luogu.org/problem/show?pid=CF1029C #include<bits/stdc++.h> using namespace std ; # ...
- PHP GD库---之微信朋友圈9张图
$item_pic = "img/item.jpg"; list($width, $height) = getimagesize($item_pic); $item_pic = i ...
- HDU 5489 Removed Interval DP 树状数组
题意: 给一个长度为\(N\)的序列,要删除一段长为\(L\)的连续子序列,问所能得到的最长的\(LIS\)的长度. 分析: 设\(f(i)\)表示以\(a_i\)结尾的\(LIS\)的长度,设\(g ...
- Python虚拟机函数机制之位置参数(四)
位置参数的传递 前面我们已经分析了无参函数的调用过程,我们来看看Python是如何来实现带参函数的调用的.其实,基本的调用流程与无参函数一样,而不同的是,在调用带参函数时,Python虚拟机必须传递参 ...
- mysql-学习链接
http://www.cnblogs.com/lyhabc/p/3691555.html
- [整理]菜鸟教程:docker使用笔记
- docker # 查看 docker stats 指令的具体使用方法 - docker stats --help # 运行一个web应用 - docker pull training/webapp ...
- POJ 2181 Jumping Cows
Jumping Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6398 Accepted: 3828 Desc ...
- gcd-模板+最小公倍数
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int G ...