【Link】:

【Description】



给你两个括号序列;

让你把这两个括号序列合并起来

(得按顺序合并)

使得组成的新的序列为合法序列;

即每个括号都能匹配;

问有多少种合并的方法;

【Solution】



设f[i][j][k]表示第一个序列取出了前i个括号,第二个序列取出了前j个括号组成的括号序列,且左括号比右括号多了k个的合并方案数;

答案就是f[len1][len2][0]

(且不会有非法的情况,即不会有右括号没被左括号匹配到)

则有转移方式

rep1(i,0,len1)
rep1(j,0,len2)
rep1(k,0,50){
if (i-1>=0){
if (s1[i]==')'){//从第一个序列拿了一个右括号
add(f[i][j][k],f[i-1][j][k+1]);
}
if (s1[i]=='(' && k > 0){//从第一个序列拿了一个左括号
add(f[i][j][k],f[i-1][j][k-1]);
}
}
if (j-1>=0){
if (s2[j]==')'){//同理
add(f[i][j][k],f[i][j-1][k+1]);
}
if (s2[j]=='(' && k > 0){
add(f[i][j][k],f[i][j-1][k-1]);
}
}
}

【NumberOf WA】



0



【Reviw】



这种合并的操作,类似每次把两个序列中的一个的开头一个一个加到字符串的末尾;



【Code】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 50;
const int MOD = 1e9 + 7;
//head
struct abc{
int x,id;
}; LL f[N+10][N+10][N+10]; void add(LL &a,LL b){
a = a+b;
while (a>=MOD) a -= MOD;
} class InterleavingParenthesisDiv2
{
public:
int countWays(string s1, string s2)
{
rep1(i,0,N)
rep1(j,0,N)
rep1(k,0,N)
f[i][j][k] = 0;
int len1 = s1.size(),len2 = s2.size();
s1 = ' '+s1,s2= ' '+s2;
f[0][0][0] = 1;
rep1(i,0,len1)
rep1(j,0,len2)
rep1(k,0,N){
if (i-1>=0){
if (s1[i]==')'){
add(f[i][j][k],f[i-1][j][k+1]);
}
if (s1[i]=='(' && k > 0){
add(f[i][j][k],f[i-1][j][k-1]);
}
}
if (j-1>=0){
if (s2[j]==')'){
add(f[i][j][k],f[i][j-1][k+1]);
}
if (s2[j]=='(' && k > 0){
add(f[i][j][k],f[i][j-1][k-1]);
}
}
}
return f[len1][len2][0];
}
};

【TC SRM 718 DIV 2 B】Reconstruct Graph的更多相关文章

  1. 【TC SRM 718 DIV 2 A】RelativeHeights

    [Link]: [Description] 给你n个数字组成原数列; 然后,让你生成n个新的数列a 其中第i个数列ai为删掉原数列中第i个数字后剩余的数字组成的数列; 然后问你这n个数列组成的排序数组 ...

  2. 【topcoder SRM 702 DIV 2 250】TestTaking

    Problem Statement Recently, Alice had to take a test. The test consisted of a sequence of true/false ...

  3. 【Codeforces Round #432 (Div. 1) B】Arpa and a list of numbers

    [链接]h在这里写链接 [题意] 定义bad list是一个非空的.最大公约数为1的序列.给定一个序列,有两种操作:花费x将一个元素删除.花费y将一个元素加1,问你将这个序列变为good list所需 ...

  4. 【SRM 716 DIV 1 A】 ConstructLCS

    Problem Statement A string S is a subsequence of a string T if we can obtain S from T by erasing som ...

  5. 【Codeforces Round #434 (Div. 1) B】Polycarp's phone book

    [链接]h在这里写链接 [题意] 给你n个电话号码. 让你给每一个电话号码选定一个字符串s; 使得这个串s是这个电话号码的子串. 且不是任何一个其他电话号码的子串. s要求最短. [题解] 字典树. ...

  6. 【Codeforces Round #493 (Div. 2) B】Cutting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然只有在前i个位置奇数偶数出现次数都相同的地方才能切. (且不管前面怎么切,这里都能切的. 那么就相当于有n个物品,每个物品的代价 ...

  7. 【Codeforces Round #499 (Div. 1) B】Rocket

    [链接] 我是链接,点我呀:) [题意] 让你猜到火星的距离x是多少. 已知1<=x<=m 然后你可以问系统最多60个问题 问题的形式以一个整数y表示 然后系统会回答你3种结果 -1 x& ...

  8. 【Codeforces Round #499 (Div. 2) E】Border

    [链接] 我是链接,点我呀:) [题意] 给你n个数字,每个数字可以无限用,每种方案可以组成一个和,问你%k的结果有多少种不同的结果. [题解] 相当于给你一个方程 \(x_1*a_1+x_2*a_2 ...

  9. 【Codeforces Round #483 (Div. 2) C】Finite or not?

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 有个性质. 如果p/q是分数的最简形式. 那么p/q能化成有限小数. 当且仅当q的质因数分解形式中只有质因子2和5 (且不能出现其他 ...

随机推荐

  1. 一、奇妙插件Tampermonkey的简单安装教程

    奇妙插件Tampermonkey的简单安装教程 1.下载 对于浏览器而言,一般的功能并不能满足"特殊用户的需求".这时候就须要插件来帮忙了.那么讲到插件的支持多又常见的浏览器必定要 ...

  2. 三层登录—c#

    学习了三层,有一个登录窗口的小练习.是我们第一次接触三层的初战.如今仅仅是简单的了解了一些,须要学习的还有非常多,以下浅谈自己的理解. 我们说的三层就是分层了显示层.业务逻辑层和数据訪问层.当中显示层 ...

  3. HDU 3016 Man Down(线段树)

    HDU 3016 Man Down 题目链接 题意:是男人就下100层的游戏的简单版,每次仅仅能从两端下落.求落地最大血量 思路:利用线段树能够处理出每一个线段能来自哪几个线段.然后就是dag最长路了 ...

  4. Java - Thinking in Java 第2章 一切都是对象

    Java是"纯粹"的面向对象的语言. 操作的标示符是对象的一个引用, new是创建一个对象. 存储位置: 寄存器\堆栈(引用)\堆(new)\常量存储(程序代码内部)\非RAM存储 ...

  5. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

  6. Filenames and paths

    Files are organized into directories (also called ‘folders’). Every running program has a ‘current d ...

  7. 二维码扫描ZXing简化

    最近项目中有需要用到二维码扫描功能,于是查了相关资料,也没有过多地研究ZXing源码,只是有了最简单的功能,因为下载大牛的demo已经完全实现了功能,只是对其中的扫描线做了更改,需要的朋友可以直接使用 ...

  8. 浅谈贝塞尔曲线以及iOS中粘性动画的实现

    关于贝塞尔曲线,网上相关的文章很多,这里我主要想用更简单的方法让大家理解贝塞尔曲线,当然,这仅仅是我个人的理解,如有错误的地方还请大家能够帮忙指出来,这样大家才能一起进步. 贝塞尔曲线,常用到的可分为 ...

  9. ES6学习4 变量的解构赋值

    变量的解构赋值 一.数组结构赋值 1.数组结构赋值 let [a, b, c] = [1, 2, 3]; ES6 可以从数组中提取值,按照对应位置,对变量赋值. 1)  本质上,这种写法属于“模式匹配 ...

  10. 今日SGU 5.26

    #include<bits/stdc++.h> #define de(x) cout<<#x<<"="<<x<<endl ...