题目大意

要求你对一个合法的括号序列进行染色,并且需要满足以下条件

1、要么不染色,要么染红色或者蓝色

2、对于任何一对括号,他们当中有且仅有一个被染色

3、相邻的括号不能染相同的颜色

题解

用区间dp[i][j][cl][cr]表示区间[i,j]被染色之后(第i个括号被染成cl色,第j个括号被染成cr色)的合法方案数

分为匹配和不匹配两种情况来处理,需要用到乘法原理,用记忆化比较好写~~~具体请看代码

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 705
#define MOD 1000000007
typedef long long LL;
LL dp[MAXN][MAXN][3][3];
int match[MAXN],q[MAXN];
char s[MAXN];
bool check(int i,int j)
{
if(i==0||j==0||i!=j) return true;
return false;
}
LL dfs(int l,int r,int cl,int cr)
{
LL &ret=dp[l][r][cl] [cr];
if(ret!=-1) return ret;
ret=0;
if(match[l]==r)
{
if((cl==0)^(cr==0))
{
if(l+1==r) return ret=1;
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
if(check(cl,i)&&check(j,cr))
ret=(ret+dfs(l+1,r-1,i,j))%MOD;
}
}
else
{
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
if(check(i,j))
ret=(ret+dfs(l,match[l],cl,i)*dfs(match[l]+1,r,j,cr))%MOD;
}
return ret;
}
int main()
{
while(~scanf("%s",s+1))
{
int n=strlen(s+1),t=1;
for(int i=1; i<=n; i++)
if(s[i]=='(') q[t++]=i;
else
match[q[--t]]=i;
LL ans=0;
memset(dp,-1,sizeof(dp));
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
ans=(ans+dfs(1,n,i,j))%MOD;
printf("%I64d\n",ans);
}
return 0;
}

Codeforces149D - Coloring Brackets(区间DP)的更多相关文章

  1. Codeforces Round #106 (Div. 2) D. Coloring Brackets —— 区间DP

    题目链接:https://vjudge.net/problem/CodeForces-149D D. Coloring Brackets time limit per test 2 seconds m ...

  2. CF149D. Coloring Brackets[区间DP !]

    题意:给括号匹配涂色,红色蓝色或不涂,要求见原题,求方案数 区间DP 用栈先处理匹配 f[i][j][0/1/2][0/1/2]表示i到ji涂色和j涂色的方案数 l和r匹配的话,转移到(l+1,r-1 ...

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

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

  4. Codeforces Round #106 (Div. 2) D. Coloring Brackets 区间dp

    题目链接: http://codeforces.com/problemset/problem/149/D D. Coloring Brackets time limit per test2 secon ...

  5. CF 149D Coloring Brackets 区间dp ****

    给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2.每对括号必须只能给其中的一个上色 3.相邻的两个不能上同色,可以都不上色 求0-len-1这一区间内 ...

  6. codeforce 149D Coloring Brackets 区间DP

    题目链接:http://codeforces.com/problemset/problem/149/D 继续区间DP啊.... 思路: 定义dp[l][r][c1][c2]表示对于区间(l,r)来说, ...

  7. CodeForces 149D Coloring Brackets 区间DP

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

  8. Codeforces 508E Arthur and Brackets 区间dp

    Arthur and Brackets 区间dp, dp[ i ][ j ]表示第 i 个括号到第 j 个括号之间的所有括号能不能形成一个合法方案. 然后dp就完事了. #include<bit ...

  9. POJ 2995 Brackets 区间DP

    POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...

随机推荐

  1. 【DB】SQLite学习笔记

    下载”System.Data.SQLite.DLL”,程序中添加引用即可 //创建数据库文件 SQLiteConnection.CreateFile("sqlitetest.db" ...

  2. makefile的简单写法

    makefile 使用方法: vi 一个Makefile文件 CC = g++   // 指的是用什么编译器RM = rm -rf   // 定义一个删除的指令(变量)CFLAGS = -c -Wal ...

  3. windows azure programing

    http://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-get-started-vs2012/ http:// ...

  4. javascript高级编程笔记03(正则表达式)

    引用类型 检测数组 注:我们实际开发中经常遇到要把数组转化成以逗号隔开,我以前都是join来实现,其实又更简单的方法可以用toString方法,它会自动用逗号隔开转换成字符串,其实toString内部 ...

  5. sizeof()和strlen()在求字符串长度时的差别

    sizeof()函数输出字符串长度时会把结束符计算在内: strlen()函数输出字符串长度时不会把结束符计算在内. 如图:

  6. 关于JDNI、JMX

    http://www.cnblogs.com/itech/archive/2010/09/16/1827999.html http://javacrazyer.iteye.com/blog/75948 ...

  7. ubuntu下的翻译软件goldendict

    转自ubuntu下的翻译软件 看着一些API虽然能看懂一个大概,但总想知道每个单词的意思.问题是英语水平有限,所以只能来找一些翻译软件,像windows下来用的有道估计是不行了(也没去试到定行不行), ...

  8. 教你6步定制你的Ubuntu桌面

    转自教你6步定制你的Ubuntu桌面 对于那些想要一个易于使用的界面的用户,Ubuntu是一个很好的Linux发行版,并且对于一个Linux新手也可以说是最好的Linux发行版.不过这产生了一些副作用 ...

  9. 1319-n皇后问题

    描述 在n×n 格的棋盘上放置彼此不受攻击的n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一 ...

  10. 排序算法-冒泡排序(Bubble Sort)

    package com.wangzhu.sort; /** * 冒泡排序算法 * @ClassName: BubbleSort * @Description: TODO * @author wangz ...