题目大概说给一个长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. 移动端hrml模板

    <!DOCTYPE html><html><head> <title>时钟</title> <meta charset="u ...

  2. Linux解决关闭终端后终止服务问题

    可使用nohup. 具体使用方法,参见:http://zjking.blog.51cto.com/976858/1117828

  3. PullToRefreshScrollView嵌套SwipeMenuListView冲突问题解决

    参考: http://blog.csdn.net/u012255016/article/details/46048797 public class NoScrollSwipeMenuListView ...

  4. MangoDB的C#Driver驱动简单例子

    以下是本人学习C#Driver驱动简单的学习例子.GridFS的增删查操作 和 表的增删查改操作. public class MongoServerHelper { public static str ...

  5. ASP.NET Web API 使用Swagger生成在线帮助测试文档

    Swagger-UI简单而一目了然.它能够纯碎的基于html+javascript实现,只要稍微整合一下便能成为方便的API在线测试工具.项目的设计架构中一直提倡使用TDD(测试驱动)原则来开发,sw ...

  6. 【JAVA基本数据类型包装类】

    一.概述 JAVA中一共有8种数据类型,分别是byte short int long boolean float double  char,与此相对应的,有8个类与它们分别对应: byte Byte ...

  7. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  8. 借助mosquitto“实时”远程监控服务器数据库运行状态

    公司的项目还处于开发阶段,我把整个后台服务临时放在阿里云上供前端测试,用的阿里云的ECS云服务器,HTTP请求服务器和数据库服务都安装在一台机子上(穷啊,凑合用),做测试用,配置相当低:单核1Gb.其 ...

  9. ZLL网关程序分析

    主机接口 zllSocCmd.h(ZLL的Socket主机接口) 此模块包含ZLL的Socket主机接口API.其包含的函数方法在zllSocCmd.c中实现 ZLL Soc Types 定义了描述设 ...

  10. PAT A 1004. Counting Leaves (30)【vector+dfs】

    题目链接:https://www.patest.cn/contests/pat-a-practise/1004 大意:输出按层次输出每层无孩子结点的个数 思路:vector存储结点,dfs遍历 #in ...