题目大概说给一个长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. August 19th 2016 Week 34th Friday

    Friends are not the people you meet at the top, they are the people who were with you at the bottom. ...

  2. hdu 1203

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 思路:01背包问题,求一份都拿不到的概率,状态转移方程dp[j]=min(dp[j],dp[j- ...

  3. java 中的一个项目如何做到访问另一个项目的一个方法 或者 页面

    两种方法:1.将一个项目打成jar包,第二个项目进行导入该jar包,就可以使用第一个项目里的类方法属性等2.将第一个项目发布出去,然后第二个项目调用,所谓发布出去就是开发远程接口,允许其他人调用.

  4. Android -- FragmentActivity添加Fragment的序列图

    FragmentActivity添加Fragment的序列图

  5. 与你相遇好幸运,Linux常用命令

    开机挂载硬盘 cat  /etc/fstab /dev/sda1  /mnt/sda1 ext3    defaults    0  0 挂载硬盘 mount  /dev/sdb5 /home/dis ...

  6. Android Matrix

    转自 :http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#code Matrix的数学原理 平移变换 旋转变换 缩放变换 错切 ...

  7. 垂直时间轴HTML

    1.概述 用时间点来展示事件发生点来代替用table展示一条条数据,能够给人清晰.一目了然能够看清事情发生的过程,UI页面也显示的那么清晰.如何用css+html做出时间轴展示事件点的?先来看看下面的 ...

  8. 在python多进程中使用manager和Barrier

    注意:Barrier是PYTHON3才有的功能,在2中无法测试. #!/usr/bin/env python # -*- coding: utf-8 -*- import multiprocessin ...

  9. java.lang.UnsupportedClassVersionError: org/xwiki/xxx : Unsupported major.minor version 51.0

    此类问题主要是因为Unsupported major.minor version 51.0. 原因是JDK版本不一致导致的问题.在web应用中碰到此问题. 应用中规定使用JDK7.0,本地JDK为6. ...

  10. win7-32 系统 + VS2010 配置 glew

    网上下载的程序,运行时报错:  C1083: 无法打开包括文件:“gl\glew.h”: No such file or directory. 百度一下,发现需要配置 glew 库. 方法如下: 下载 ...