题目链接 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);
}

最新文章

  1. 使用CSS3的box-shadow实现双透明遮罩层对话框
  2. 彻底卸载Oracle
  3. BIRT报表工具,直接导出EXCEL
  4. [转]分享php中四种webservice实现的简单架构方法及实例
  5. Web Service 其他服务器检测不到查询测试按钮
  6. Nvidia VertexTextureFetch Water
  7. Hibernate,JPA注解@OneToMany_Set
  8. 2016年12月15日 星期四 --出埃及记 Exodus 21:10
  9. 【转】让itunes下载加速的真正办法,转向至香港台湾澳门苹果服务器 -- 不错不错!!!
  10. JavaScript学习总结【5】、JS DOM
  11. 怎么给当前点击的a标签添加一个样式(跳转页面后)
  12. log4go的精确定时程序(带自动延迟补偿)
  13. maven常见问题处理(3-2)maven打包时跳过测试的几个方法
  14. Android 四种常见的线程池
  15. 第12章 添加对外部认证的支持 - Identity Server 4 中文文档(v1.0.0)
  16. Java中的volatile变量有什么作用?
  17. ESB开发WebService接口
  18. PHP与Nginx之间的运行机制以及原理
  19. C# web Api ajax发送json对象到action中
  20. 使用jquery获取父元素或父节点

热门文章

  1. XML映射文件中关系映射
  2. Ubuntu 15 下 Qt 配置mysql链接及基本操作
  3. CodeForces - 899E Segments Removal (优先队列 + 链表)
  4. Persona5
  5. Mysql主键一致时,可以进行在元数据上的操作
  6. Linux学习-善用判断式
  7. 下拉列表 Spinner
  8. day04 装饰器 迭代器&amp;生成器 Json &amp; pickle 数据序列化 内置函数
  9. php-数据库连接类
  10. ogre3D学习基础11 -- 交换两个场景管理器