题目大概说给一个长m的括号序列s,要在其前面和后面添加括号使其变为合法的长度n的括号序列,p+s+q,问有几种方式。(合法的括号序列当且仅当左括号总数等于右括号总数且任何一个前缀左括号数大于等于右括号数)

我这么想的:n-m<=2000,因而可以dp计算p和q的方案数,同时在各个地方加入s进行转移。

  • dp[0/1][i][j]表示s没有/有加入时,p和q前i个括号已经确定且还有j的左括号还没匹配的方案数
  • 注意到任何前缀的左括号都是大于等于右括号的,因此j这一维不会小于0。
  • 那么转移,我用我为人人转移,就是:
  • 尾巴加上左括号:

d[0][i+1][j+1]+=d[0][i][j]

  • 尾巴加上右括号:

d[0][i+1][j-1]+=d[0][i][j]

  • 尾巴加上左括号和s:

d[1][i+1][j+1+cnt]+=d[0][i][j](cnt=s中左括号数-右括号数)

  • 尾巴加上右括号和s:

d[1][i+1][j-1+cnt]+=d[0][i][j](cnt=s中左括号数-右括号数)

  • 从已经加上s的转移:

d[1][i+1][j+1]+=d[1][i][j]

d[1][i+1][j-1]+=d[1][i][j]

这些转移前提是要合法。合法情况还有一点要注意的是,s不一定都能随便放到p和q任何一个地方的,因为可能出现p+s的序列不合法,即p+s序列中存在前缀左括号数小于右括号数,所以还要用j这一维的值与cnt的值比较。

看了下题解,它的做法是求出dp[i][j],这个dp[i][j]既是前缀方案数又是后缀方案数,因为后缀相当于前缀反过来,其右括号数目大于等于左括号数目。通过枚举p的i和j来确定q,而q是后缀,而二者的方案数乘积为答案的一部分贡献。

另外这一题写完后直接提交差点点1A了,不过感觉还不错,难得考虑全面。。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d[][][];
int main(){
char ch;
int n,m,cnt=,precnt=;
scanf("%d%d",&n,&m);
int N=n-m;
for(int i=; i<m; ++i){
scanf(" %c",&ch);
if(ch=='(') ++cnt;
else --cnt;
precnt=min(precnt,cnt);
}
d[][][]=;
if(<=cnt&& cnt<=*N && precnt==) d[][][cnt]=;
for(int i=; i<N; ++i){
for(int j=; j<=*N; ++j){
if(j+<=*N){
d[][i+][j+]+=d[][i][j];
d[][i+][j+]%=;
}
if(j->=){
d[][i+][j-]+=d[][i][j];
d[][i+][j-]%=;
}
if(j+<=*N){
d[][i+][j+]+=d[][i][j];
d[][i+][j+]%=;
}
if(j->=){
d[][i+][j-]+=d[][i][j];
d[][i+][j-]%=;
}
if(<=j++cnt && j++cnt<=*N && j++precnt>=){
d[][i+][j++cnt]+=d[][i][j];
d[][i+][j++cnt]%=;
}
if(<=j-+cnt && j-+cnt<=*N && j-+precnt>=){
d[][i+][j-+cnt]+=d[][i][j];
d[][i+][j-+cnt]%=;
}
}
}
printf("%d",d[][N][]);
return ;
}

Codeforces 629C Famil Door and Brackets(DP)的更多相关文章

  1. codeforces629C Famil Door and Brackets (dp)

    题意:给你一个长度为n的括号匹配串(不一定恰好匹配),让你在这个串的前面加p串和后面加上q串,使得这个括号串平衡(平衡的含义是对于任意位置的括号前缀和大于等于0,且最后的前缀和为0). 思路:枚举这个 ...

  2. codeforces 629C Famil Door and Brackets (dp + 枚举)

    题目链接: codeforces 629C Famil Door and Brackets 题目描述: 给出完整的括号序列长度n,现在给出一个序列s长度为m.枚举串p,q,使得p+s+q是合法的括号串 ...

  3. Codeforces 629C Famil Door and Brackets DP

    题意:给你一个由括号组成的字符串,长度为m,现在希望获得一个长度为n(全由括号组成)的字符串,0<=n-m<=2000 这个长度为n的字符串要求有两个性质:1:就是任意前缀,左括号数量大于 ...

  4. CodeForces 629C Famil Door and Brackets

    DP. 具体做法:dp[i][j]表示长度为 i 的括号串,前缀和(左括号表示1,右括号表示-1)为 j 的有几种. 状态转移很容易得到:dp[i][j]=dp[i - 1][j + 1]+dp[i ...

  5. codeforces 425C Sereja and Two Sequences(DP)

    题意读了好久才读懂....不知道怎么翻译好~~请自便~~~ http://codeforces.com/problemset/problem/425/C 看懂之后纠结好久...不会做...仍然是看题解 ...

  6. Codeforces Beta Round #13 C. Sequence (DP)

    题目大意 给一个数列,长度不超过 5000,每次可以将其中的一个数加 1 或者减 1,问,最少需要多少次操作,才能使得这个数列单调不降 数列中每个数为 -109-109 中的一个数 做法分析 先这样考 ...

  7. codeforces #267 C George and Job(DP)

    职务地址:http://codeforces.com/contest/467/problem/C 太弱了..这题当时都没做出来..思路是有的,可是自己出的几组数组总是过不去..今天又又一次写了一遍.才 ...

  8. Codeforces 403D: Beautiful Pairs of Numbers(DP)

    题意:转换模型之后,就是1~n个数中选k个,放到一个容量为n的背包中,这个背包还特别神奇,相同的物品摆放的位置不同时,算不同的放法(想象背包空间就是一个长度为n的数组,然后容量为1的物体放一个格子,容 ...

  9. CodeForces B. The least round way(dp)

    题目链接:http://codeforces.com/problemset/problem/2/B B. The least round way time limit per test 5 secon ...

随机推荐

  1. iOS真机调试

    备注:本阶段之前的修改配置文件.准备脚本等,只需要做一次.但本阶段的操作,对每个需要真机调试的工程都要做一遍. ① 禁用Xcode自动的签名操作 将工程配置“Build Settings”中所有的Co ...

  2. MyBatis mapper文件中的变量引用方式#{}与${}的差别

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

  3. Linux(CentOS)系统下设置nginx开机自启动

    Nginx 是一个很强大的高性能Web和反向代理服务器.下面介绍在linux下安装后,如何设置开机自启动.首先,在linux系统的/etc/init.d/目录下创建nginx文件,使用如下命令:vi ...

  4. 三、jQuery--jQuery基础--jQuery基础课程--第10章 jQuery UI型插件

    1.拖曳插件——draggable 拖曳插件draggable的功能是拖动被绑定的元素,当这个jQuery UI插件与元素绑定后,可以通过调用draggable()方法,实现各种拖曳元素的效果,调用格 ...

  5. C#学习笔记--详解委托,事件与回调函数

    .Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等.“protected void Pag ...

  6. SQLServer事务

    指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)由多个sql语句组成,必须作为一个整体执行这些sql语句作为一个整体一起向系统提交,要么都执行.要么都不执行 语法步骤:开始事务:BEG ...

  7. ODATA WEB API(二)----ODATA服务与客户端

    一.概述 ODATA不经可以作为WebAPI建立相应的WEBAPI控制器,还可以建立ODataControl控制器,能够通过插件建立第三方ODataClinet类库:调用和使用数据变得简单可行. 二. ...

  8. sdut 2441 屠夫与狼

    屠夫和狼 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...

  9. VC++中字符串编码的转换

    在以前VC++6.0中默认的字符集是多字节字符集(MBCS:Multi-Byte Character Set),而VS2005及以后默认的字符集是Unicode,这样导致以前在VC6.0中非常简单实用 ...

  10. [JavaCore] 微信手机浏览器版本判断

    公司要做微支付,微信浏览器版本要大于5 package com.garinzhang.web.weixin; import org.apache.commons.lang.StringUtils; i ...