http://codeforces.com/problemset/problem/149/D

题意 给一个合法的括号串,然后问这串括号有多少种涂色方案,当然啦!涂色是有限制的。

  1,每个括号只有三种选择:涂红色,涂蓝色,不涂色。

  2,每对括号有且仅有其中一个被涂色。

  3,相邻的括号不能涂相同的颜色,但是相邻的括号可以同时不涂色。

当dp的状态转移方程实现比较复杂的时候的时候,我们不需要非要写出他的状态转移方程,而是通过dfs的方式实现状态的转移。

这句话在之前写的状压dp三进制解法中出现过 https://www.cnblogs.com/Hugh-Locke/p/9499717.html

想了很久的dp递推式,发现是区间dp的时候依然觉得不能像寻常区间dp一样两端的去扩展,在这种时候可以考虑用dfs去实现

任何括号字符串都可以分为两类 ((((())))) 这样的和 ()()()()()这样的,第一种我们考虑两边层层推入,搜索dfs(l + 1,r - 1)之后去递推。

第二种我们考虑分而治之,分为两边互为独立的括号区间然后合并,比如分为()和()()()()合并的方式是两边相乘。

dp边界,也就是当我们最终把两类简化到不能再简化的时候,都会变成()

区间dp+dfs,又有点像记忆化搜索的方式实现即可。

#include <map>
#include <set>
#include <ctime>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
#define For(i, x, y) for(int i=x;i<=y;i++)
#define _For(i, x, y) for(int i=x;i>=y;i--)
#define Mem(f, x) memset(f,x,sizeof(f))
#define Sca(x) scanf("%d", &x)
#define Sca2(x,y) scanf("%d%d",&x,&y)
#define Scl(x) scanf("%lld",&x);
#define Pri(x) printf("%d\n", x)
#define Prl(x) printf("%lld\n",x);
#define CLR(u) for(int i=0;i<=N;i++)u[i].clear();
#define LL long long
#define ULL unsigned long long
#define mp make_pair
#define PII pair<int,int>
#define PIL pair<int,long long>
#define PLL pair<long long,long long>
#define pb push_back
#define fi first
#define se second
typedef vector<int> VI;
const double eps = 1e-;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
int N,M,tmp,K,len;
char str[maxn];
int link[maxn];
int Stack[maxn];
LL dp[maxn][maxn][][];
void find(){
int cnt = ;
For(i,,len){
if(str[i] == '('){
Stack[++cnt] = i;
}else{
link[i] = Stack[cnt];
link[Stack[cnt--]] = i;
}
}
}
void dfs(int l,int r){
if(l == r - ){
dp[l][r][][] = ;
dp[l][r][][] = ;
dp[l][r][][] = ;
dp[l][r][][] = ;
return;
}
if(link[l] == r){
dfs(l + ,r - );
For(i,,){
For(j,,){
if(i != ) dp[l][r][][] = (dp[l][r][][] + dp[l + ][r - ][i][j]) % mod;
if(i != ) dp[l][r][][] = (dp[l][r][][] + dp[l + ][r - ][i][j]) % mod;
if(j != ) dp[l][r][][] = (dp[l][r][][] + dp[l + ][r - ][i][j]) % mod;
if(j != ) dp[l][r][][] = (dp[l][r][][] + dp[l + ][r - ][i][j]) % mod;
}
}
}else{
int m = link[l];
dfs(l,m); dfs(m + ,r);
For(i,,){
For(j,,){
For(x,,){
For(y,,){
if(j && (j == x)) continue;
dp[l][r][i][y] = (dp[l][r][i][y] + dp[l][m][i][j] * dp[m + ][r][x][y]) % mod;
}
}
}
}
}
}
int main()
{
scanf("%s",str + );
len = strlen(str + );
find();
dfs(,len);
LL sum = ;
For(i,,){
For(j,,){
sum += dp[][len][i][j]; sum %= mod;
}
}
Prl(sum);
#ifdef VSCode
system("pause");
#endif
return ;
}

CodeForces149D dfs实现区间dp的更多相关文章

  1. Codeforces149D - Coloring Brackets(区间DP)

    题目大意 要求你对一个合法的括号序列进行染色,并且需要满足以下条件 1.要么不染色,要么染红色或者蓝色 2.对于任何一对括号,他们当中有且仅有一个被染色 3.相邻的括号不能染相同的颜色 题解 用区间d ...

  2. HDU 4597 Play Game(DFS,区间DP)

    Play Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Sub ...

  3. 【BZOJ-4380】Myjnie 区间DP

    4380: [POI2015]Myjnie Time Limit: 40 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 162  Solved: ...

  4. hdu 4597 + uva 10891(一类区间dp)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=19461 思路:一类经典的博弈类区间dp,我们令dp[l][r]表示玩家A从区间[l, r] ...

  5. nyoj 737 石子合并(一)。区间dp

    http://acm.nyist.net/JudgeOnline/problem.php?pid=737 数据很小,适合区间dp的入门 对于第[i, j]堆,无论你怎么合并,无论你先选哪两堆结合,当你 ...

  6. HDU 5115 Dire Wolf 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...

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

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

  8. UVA - 10891 Game of Sum 区间DP

    题目连接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19461 Game of sum Description This ...

  9. 2016"百度之星" - 初赛(Astar Round2A) 1004 D Game 区间DP

    D Game Problem Description   众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只 ...

随机推荐

  1. Create an Azure SQL database in the Azure portal

    Create a SQL database An Azure SQL database is created with a defined set of compute and storage res ...

  2. css背景色 透明字体不透明

    .demo{ padding: 25px; background-color: rgba(,,,0.5);/* IE9.标准浏览器.IE6和部分IE7内核的浏览器(如QQ浏览器)会读懂 */ }

  3. 简单探究Android平台下' if ' 语句条件判断耗时情况

    2017年6月13日 前言 前几日在改Bug时看到好多调试时用的日志语句都被一个日志开关控制着它的执行权.形如: if(Constants.LOG_TAG){ Log.d(TAG, "Ini ...

  4. BZOJ3133[ballmachine]——倍增+优先队列

    题目描述 有一个装球机器,构造可以看作是一棵树.有下面两种操作: 从根放入一个球,只要下方有空位,球会沿着树滚下.如果同时有多个点可以走,那么会选择编号最小的节点所在路径的方向.比如依次在树根4放2个 ...

  5. P1020 导弹拦截

    思路:贪心思路 拿比飞来的导弹高并且高度和飞来的导弹最相近的拦截系统去接, 如果全部都比导弹矮,那就新开一个拦截系统 #include<cstdio> #include<string ...

  6. Heron and His Triangle HDU - 6222(pell 大数)

    ---恢复内容开始--- Heron and His Triangle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/2 ...

  7. linux下执行sh脚本,提示Command not found解决办法

    1.确保用户对文件有读写及执行权限 oracle@linux-106:~/RMAN/bin> chmod a+x test.sh 2.然后修改文件格式(如果是从winodws搬过来的会显示dos ...

  8. LOJ #2048. 「HNOI2016」最小公倍数

    题意 有 \(n\) 个点,\(m\) 条边,每条边连接 \(u \Leftrightarrow v\) 且权值为 \((a, b)\) . 共有 \(q\) 次询问,每次询问给出 \(u, v, q ...

  9. ELK部署详解--filebeat

    filebeat.yml ###################### Filebeat Configuration Example ######################### # This ...

  10. 【原】本地仓库推送到远程仓库:fatal: refusing to merge unrelated histories

    最近,在操作git的时候,遇到各种问题,下面总结一下. 最开始,我不是先把远程仓库拉取到本地 ,而是直接在本地先创建一个仓库,再git remote add添加远程仓库. 当然,gitee官方还是有操 ...