题目描述
Petya遇到了一个关于括号序列的问题: 给定一个字符串S,它代表着正确的括号序列,即(“(”)与 (“)”)是匹配的。例如:“(())()” 和 “()”是正确的,“)()”与“(()”则不是正确的。 在正确的括号序列中,一个左边的括号一定是匹配一个右边的括号(反之亦然)。例如,在下图中,第 3 个括号匹配第 6 个括号,第 4 个括号匹配第 5 个括号。
现在你需要对一个正确的括号序列做涂色操作,严格满足以下三个条件:

1、每个括号要么不涂色,要么涂红色,要么涂蓝色。

2、一对匹配的括号需要且只能将其中一个涂色。

3、相邻的括号不能涂上同一种颜色(但是可以都不涂颜色)。

求:给整个括号序列涂上颜色的方案数,答案可能比较大,对 1000000007 取模。

输入格式
输入的第一行包含一个字符串 s,(2 <= |s| <= 700)代表一个正确的括号序列。

输出格式
输出方案数。(对 10^9 + 7 取模)

样例
样例1输入
(())
样例1输出
12
样例2输入
(()())
样例2输出
40
样例3输入
()
样例3输出
4
来源:CF149D
此题的主要方法是先分类讨论,要考虑左右边界是否配对
1.如果配对
则会直接继承l+1,r-1的所有方案
2如果不配对
找到左边界配对的,并把[l,r]划分成两个区间最后俩区间方案合并

#include<bits/stdc++.h>
using namespace std;
char s[705];
int pd[705];
long long int xx[705];
long long int t=1;
long long int ans=0;
long long int qc[705][705]={0};
long long int dp[705][705][3][3]={0};//dp[l][r][配色][配色]
void dfs(long long int l,long long int r)
{
if(qc[l][r])//边界
{
return;
}
qc[l][r]=1;
if(r-l==1)
{
dp[l][r][0][1]=1;
dp[l][r][0][2]=1;
dp[l][r][1][0]=1;
dp[l][r][2][0]=1; //()时,配色方案为一个定值
return;//一定走不了了
} if(pd[l]==r)//可匹配 所一,他的方案数来自与l+1,r-1,方案数的总和
{
dfs(l+1,r-1);//算出前面的接果,不断向一个点缩
for(int i=0;i<=2;i++)//枚举着色 (())
{
for(int j=0;j<=2;j++)//右边界
{
for(int k=0;k<=2;k++) //左+1
{
for(int a=0;a<=2;a++)//右+1
{
if((i==0||j==0)&&(i!=0||j!=0)&&(i!=k||(i+k==0))&&(j!=a||(j+a==0)))//1、每个括号要么不涂色,要么涂红色,要么涂蓝色。且只能将其中一个涂色。3,4、邻的括号不能涂上同一种颜色(但是可以都不涂颜色)。
{
dp[l][r][i][j]+=dp[l+1][r-1][k][a];//累加
dp[l][r][i][j]%=1000000007;//因为如果l+1,r+1无发配对,会进入下一个else中,所以不用判断l+1,r-1是否配对
}
}
}
}
}
}
else
{
dfs(l,pd[l]);
dfs(pd[l]+1,r);//不能把pd[l]算二次,所以要+1
for(int i=0;i<=2;i++)//枚举着色
{
for(int j=0;j<=2;j++)//与上面一样,i,j在一个括号中,i,a是左右端点
{
for(int k=0;k<=2;k++)
{
for(int a=0;a<=2;a++)
{
if((i==0||j==0)&&(i!=0||j!=0)&&(j!=k||(j+k==0)))// j与k是相邻的,要判断;
{
dp[l][r][i][a]+=dp[l][pd[l]][i][j]*dp[pd[l]+1][r][k][a];//为什么要*呢?设为a A,a可一与A,B,C和并,b也是,所以和并时,为两边之积
dp[l][r][i][a]%=1000000007;//而且dp[l][r][i][a]要累加所有合并之积 b B
}// c C
}
}
}
} }
}
int main()
{
scanf("%s",s+1);
long long int n=strlen(s+1);//如果字符串+1,strlen()中的字符串也要
for(int i=1;i<=n;i++)
{
if(s[i]=='(')
{
xx[t++]=i;
}
else
{
pd[xx[--t]]=i;//模拟一个栈
}
}
/*for(int i=1;i<=n;i++)
{
printf("%d ",pd[i]);
}*/
dfs(1,n);
for(int i=0;i<=2;i++)
{
for(int j=0;j<=2;j++)
{
ans+=dp[1][n][i][j];//加上不同配色的所有方案
ans%=1000000007;
}
}
printf("%lld",ans);
}

CF149D游戏的更多相关文章

  1. 使用HTML5开发Kinect体感游戏

    一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决, ...

  2. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

  3. Unity游戏内版本更新

    最近研究了一下游戏内apk包更新的方法. ios对于应用的管理比较严格,除非热更新脚本,不太可能做到端内大版本包的更新.然而安卓端则没有此限制.因此可以做到不跳到网页或应用商店,就覆盖更新apk包. ...

  4. 游戏服务器菜鸟之C#初探一游戏服务

    本人80后程序猿一枚,原来搞过C++/Java/C#,因为工作原因最后选择一直从事C#开发,因为读书时候对游戏一直比较感兴趣,机缘巧合公司做一个手游的项目,我就开始游戏服务器的折腾之旅. 游戏的构架是 ...

  5. iOS审核这些坑,腾讯游戏也踩过

    作者:Jamie,专项技术测试工程师,在iOS预审和ASO优化领域从事专项测试相关工作,为腾讯游戏近100个产品提供专项服务. WeTest 导读 在App上架苹果应用商店的过程中,相信大多数iOS开 ...

  6. 漫谈C#编程语言在游戏领域的应用

    0x00 前言 随着微软越来越开放,C#也变得越来越吸引人们的眼球.而在游戏行业中,C#也开始慢慢地获得了关注.这不, 网易绝代双娇手游团队已经全面使用.Net Core支持前后端统一C#开发,跨平台 ...

  7. 解构C#游戏框架uFrame兼谈游戏架构设计

    1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...

  8. 趣说游戏AI开发:曼哈顿街角的A*算法

    0x00 前言 请叫我标题党!请叫我标题党!请叫我标题党!因为下面的文字既不发生在美国曼哈顿,也不是一个讲述美国梦的故事.相反,这可能只是一篇没有那么枯燥的关于算法的文章.A星算法,这个在游戏寻路开发 ...

  9. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

随机推荐

  1. Linux:expr、let、for、while、until、shift、if、case、break、continue、函数、select

    1.expr计算整数变量值 格式 :expr arg 例子:计算(2+3)×4的值 1.分步计算,即先计算2+3,再对其和乘4 s=`expr 2 + 3` expr $s \* 4 2.一步完成计算 ...

  2. @PropertySource配置的用法

    功能 加载指定的属性文件(*.properties)到 Spring 的 Environment 中.可以配合 @Value 和@ConfigurationProperties 使用. @Proper ...

  3. 【Service】【Database】【MySQL】基础概念

    1. 数据模型:层次模型.网状模型.关系模型 关系模型: 二维关系: 表:row, column 索引:index 视图:view 2. SQL接口:Structured Query Language ...

  4. 【Java 8】Stream通过reduce()方法合并流为一条数据示例

    在本页中,我们将提供 Java 8 Stream reduce()示例. Stream reduce()对流的元素执行缩减.它使用恒等式和累加器函数进行归约. 在并行处理中,我们可以将合并器函数作为附 ...

  5. 使用AOP思想实现日志的添加

    //1.创建日志表syslog------->创建日志的实体类--------->在web.xml中配置监听 <listener>     <listener-class ...

  6. grep命令输出显示高亮字

    grep命令执行后,终端上输出显示颜色可以加"--color=auto"的参数. 另外的两个办法是: 1.设置环境变量: export GREP_OPTIONS="--c ...

  7. 【C/C++】01背包问题/动态规划

    按小蓝书上写的大数据情况下没过,按解答区一个大佬的修改了过了 #include <bits/stdc++.h> using namespace std; class Solution { ...

  8. Python openpyxl的使用

    import openpyxl from openpyxl.styles import Font, colors, Alignment wb = openpyxl.load_workbook('C:\ ...

  9. CF80B Depression 题解

    Content 有一个时针,给定时间为 \(\text{HH}\) 时 \(\text{MM}\) 分,求图中 \(\alpha\) 和 \(\beta\) 角的值. 手画勿喷/kk 数据范围:\(0 ...

  10. PSpice基本仿真分析例程

    一.瞬态分析 二.直流分析 2.1.直流分析电路 2.2.直流分析配置 2.3.直流分析输出波形 受供电电源的限制,输出最大值为±15V. 三.交流分析 3.1.1.交流分析电路1 3.1.1.交流分 ...