题目描述
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. 数据源(Data Source

    数据源(Data Source)顾名思义,数据的来源,是提供某种所需要数据的器件或原始媒体.在数据源中存储了所有建立数据库连接的信息.就像通过指定文件名称可以在文件系统中找到文件一样,通过提供正确的数 ...

  2. 解决“该Jenkins实例似乎已离线”

    在jenkins/pluginManager/advanced最下面 把:https://updates.jenkins-ci.org/update-center.json 换成: 1.http:// ...

  3. AI 2021 年度报告

    建议大伙有空还是自己亲自读一下,虽然有点长,188页ppt. https://docs.google.com/presentation/d/1bwJDRC777rAf00Drthi9yT2c9b0Ma ...

  4. Apache Log4j 远程代码执行漏洞源码级分析

    漏洞的前因后果 漏洞描述 漏洞评级 影响版本 安全建议 本地复现漏洞 本地打印 JVM 基础信息 本地获取服务器的打印信息 log4j 漏洞源码分析 扩展:JNDI 危害是什么? GitHub 项目 ...

  5. 车载以太网第二弹 | 测试之实锤-物理层PMA测试实践

    前言 本期先从物理层"PMA测试"开始,下图1为"PMA测试"的测试结果汇总图.其中,为了验证以太网通信对线缆的敏感度,特选取两组不同特性线缆进行测试对比,果然 ...

  6. 【.NET 与树莓派】WS28XX 灯带的颜色渐变动画

    在上一篇水文中,老周演示了 WS28XX 的基本使用.在文末老周说了本篇介绍颜色渐变动画的简单实现. 在正式开始前,说一下题外话. 第一件事,最近树莓派的价格猛涨,相信有关注的朋友都知道了.所以,如果 ...

  7. IDEA 2021.2.1 破解版下载_激活安装图文教程(永久激活,亲测有效)

    1.IntelliJ IDEA 2021 链接:https://pan.baidu.com/s/1Pwz3GrrkJdDZzg-wg5UjMw 提取码:56o6 无限重置 30 天试用期补丁 链接:h ...

  8. 字节面试:SYN 包在什么场景下会被丢弃?

    大家好,我是小林. 之前有个读者在秋招面试的时候,被问了这么一个问题:SYN 报文什么时候情况下会被丢弃? 好家伙,现在面试都问那么细节了吗? 不过话说回来,这个问题跟工作上也是有关系的,因为我就在工 ...

  9. java 网络编程基础 InetAddress类;URLDecoder和URLEncoder;URL和URLConnection;多线程下载文件示例

    什么是IPV4,什么是IPV6: IPv4使用32个二进制位在网络上创建单个唯一地址.IPv4地址由四个数字表示,用点分隔.每个数字都是十进制(以10为基底)表示的八位二进制(以2为基底)数字,例如: ...

  10. 【LeetCode】286. Walls and Gates 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 BFS 日期 题目地址:https://leetcod ...