Code Forces 149DColoring Brackets(区间DP)
2 seconds
256 megabytes
standard input
standard output
Once Petya read a problem about a bracket sequence. He gave it much thought but didn't find a solution. Today you will face it.
You are given string s. It represents a correct bracket sequence. A correct bracket sequence is the sequence of opening ("(")
and closing (")") brackets, such that it is possible to obtain a correct mathematical expression from it, inserting numbers and operators between the brackets.
For example, such sequences as "(())()" and "()" are correct
bracket sequences and such sequences as ")()" and "(()" are
not.
In a correct bracket sequence each bracket corresponds to the matching bracket (an opening bracket corresponds to the matching closing bracket and vice versa). For example, in a bracket sequence shown of the figure below, the third bracket corresponds to the
matching sixth one and the fifth bracket corresponds to the fourth one.
You are allowed to color some brackets in the bracket sequence so as all three conditions are fulfilled:
- Each bracket is either not colored any color, or is colored red, or is colored blue.
- For any pair of matching brackets exactly one of them is colored. In other words, for any bracket the following is true: either it or the matching bracket that corresponds to it is colored.
- No two neighboring colored brackets have the same color.
Find the number of different ways to color the bracket sequence. The ways should meet the above-given conditions. Two ways of coloring are considered different if they differ in the color of at least one bracket. As the result can be quite large, print it modulo 1000000007 (109 + 7).
The first line contains the single string s (2 ≤ |s| ≤ 700)
which represents a correct bracket sequence.
Print the only number — the number of ways to color the bracket sequence that meet the above given conditions modulo 1000000007 (109 + 7).
- (())
- 12
- (()())
- 40
- ()
- 4
关于区间DP,可以参照这个博客
http://blog.csdn.net/dacc123/article/details/50885903
- #include <iostream>
- #include <string.h>
- #include <stdlib.h>
- #include <algorithm>
- #include <math.h>
- #include <stdio.h>
- #include <stack>
- using namespace std;
- const long long int mod=1e9+7;
- char a[705];
- long long int dp[705][705][3][3];
- int s[705];
- int m[705];
- int top;
- void dfs(int i,int j)
- {
- if(j-i==1)
- {
- dp[i][j][0][1]=1;
- dp[i][j][0][2]=1;
- dp[i][j][1][0]=1;
- dp[i][j][2][0]=1;
- return;
- }
- else if(m[i]==j)
- {
- dfs(i+1,j-1);
- for(int p=0;p<3;p++)
- {
- for(int q=0;q<3;q++)
- {
- if(q!=1) dp[i][j][0][1]=(dp[i][j][0][1]+dp[i+1][j-1][p][q])%mod;
- if(q!=2) dp[i][j][0][2]=(dp[i][j][0][2]+dp[i+1][j-1][p][q])%mod;
- if(p!=1) dp[i][j][1][0]=(dp[i][j][1][0]+dp[i+1][j-1][p][q])%mod;
- if(p!=2) dp[i][j][2][0]=(dp[i][j][2][0]+dp[i+1][j-1][p][q])%mod;
- }
- }
- return;
- }
- else
- {
- int k=m[i];
- dfs(i,k);
- dfs(k+1,j);
- for(int p=0;p<3;p++)
- for(int q=0;q<3;q++)
- for(int x=0;x<3;x++)
- for(int y=0;y<3;y++)
- if(!((y==1&&x==1)||(y==2&&x==2)))
- dp[i][j][p][q]=(dp[i][j][p][q]+(dp[i][k][p][x]*dp[k+1][j][y][q])%mod)%mod;
- return;
- }
- }
- int main()
- {
- while(scanf("%s",a)!=EOF)
- {
- int len=strlen(a);
- top=-1;
- for(int i=0;i<len;i++)
- {
- if(a[i]=='(')
- s[++top]=i;
- else
- {
- m[s[top]]=i;
- //m[i]=s[top];
- top--;
- }
- }
- memset(dp,0,sizeof(dp));
- dfs(0,len-1);
- long long int ans=0;
- for(int i=0;i<3;i++)
- for(int j=0;j<3;j++)
- ans=(ans+dp[0][len-1][i][j])%mod;
- printf("%lld\n",ans);
- }
- return 0;
- }
Code Forces 149DColoring Brackets(区间DP)的更多相关文章
- Codeforces 508E Arthur and Brackets 区间dp
Arthur and Brackets 区间dp, dp[ i ][ j ]表示第 i 个括号到第 j 个括号之间的所有括号能不能形成一个合法方案. 然后dp就完事了. #include<bit ...
- POJ 2995 Brackets 区间DP
POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...
- CF149D. Coloring Brackets[区间DP !]
题意:给括号匹配涂色,红色蓝色或不涂,要求见原题,求方案数 区间DP 用栈先处理匹配 f[i][j][0/1/2][0/1/2]表示i到ji涂色和j涂色的方案数 l和r匹配的话,转移到(l+1,r-1 ...
- Brackets(区间dp)
Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3624 Accepted: 1879 Descript ...
- POJ2955:Brackets(区间DP)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- HOJ 1936&POJ 2955 Brackets(区间DP)
Brackets My Tags (Edit) Source : Stanford ACM Programming Contest 2004 Time limit : 1 sec Memory lim ...
- POJ2955 Brackets —— 区间DP
题目链接:https://vjudge.net/problem/POJ-2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Su ...
- poj 2955 Brackets (区间dp基础题)
We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...
- poj2955 Brackets (区间dp)
题目链接:http://poj.org/problem?id=2955 题意:给定字符串 求括号匹配最多时的子串长度. 区间dp,状态转移方程: dp[i][j]=max ( dp[i][j] , 2 ...
随机推荐
- linux -- Ubuntu 安装搜狗输入法
在Ubuntu Kylin系统中,默认安装搜狗拼音输入法,但是在原生Ubuntu系统中则不是.这可以理解,毕竟搜狗输入法的Linux版有Kylin团队的不小功劳.由于搜狗输入法确实比Linux系统下其 ...
- PHPCMS v9设置文章的审核功能
对于新建的站点,如果想设置会员发布的文章必须通过审核后才能发布,则需要以下几步来完成: 1.根据需要自定义管理员角色或选择已有角色. 步骤:设置->管理员设置->角色管理->权限设置 ...
- php面向对象(OOP)编程完整教程
http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/10/1823042.html
- VR资源浏览网站
https://my.matterport.com 资源 https://my.matterport.com/show/?m=kCeVCzCjQ5s
- 使用mysqldump工具对数据库进行全备份
需求描述: 通过mysqldump工具的--all-databases选项对所有数据库进行备份. 操作过程: 1.通过--all-databases选项对所有的数据库进行备份 [mysql@redha ...
- Supervisor安装与配置(非守护进程管理工具)
http://blog.csdn.net/xyang81/article/details/51555473
- ios 调用系统应用的方法 应用间跳转的方法
声明一个私有方法: #pragma mark - 私有方法 -(void)openUrl:(NSString *)urlStr{ //注意url中包含协议名称,iOS根据协议确定调用哪个应用,例如发送 ...
- osgEarth的agglite插件使用例子feature_rasterize.earth
<!-- osgEarth Sample Demonstrates use of the "agglite" feature rasterization driver. -- ...
- Array遍历的小技巧
如果在遍历中删除或增加了部分元素,就会导致遍历失败,因为对象数组的长度发生了变化,索引随之而变,遍历的结果不完整或者引发运行时错误.其实不需要任何复杂的判断,最简单的方法是:倒过来遍历,像这样: f ...
- N76E003学习之路(二)
最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...