【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];
}
};

最新文章

  1. SQL Saturday 北京将于7月25日举办线下活动,欢迎参加
  2. 聊一下JS中的作用域scope和闭包closure
  3. jetty使用教程(嵌入eclipse开发)
  4. Android加载网络图片的工具类
  5. 剑指offer习题集
  6. MVC新手指南
  7. MySQL的SQL_CALC_FOUND_ROWS真的很慢么?
  8. 韩顺平HTML5教程www.gis520.com
  9. 防止自己的网站被别人frame引用造成钓鱼
  10. Ctrl+Alt+T恢复启动Ubuntu默认终端
  11. 【Java学习笔记之十三】初探Java面向对象的过程及代码实现
  12. Python爬虫10-页面解析数据提取思路方法与简单正则应用
  13. Java的selenium代码随笔(8)
  14. [转] ReactJS之JSX语法
  15. sql多表查询(单表查询略过)
  16. php 编译安装 mysql.so
  17. 安卓webview子线程网络请求,怎么获得结果?
  18. shell脚本函数
  19. CXAnimation类
  20. Django笔记 —— 表单(form)

热门文章

  1. php使用flock堵塞写入文件和非堵塞写入文件
  2. angularjs 缓存 $q
  3. 反弹木马——本质上就是一个开80端口的CS程序,伪造自己在浏览网页
  4. Word或Excel里画柱状图和折线图组合体
  5. dedecms后台登录,与后台界面去除多于的样式
  6. tensorflow 问题库
  7. 洛谷P1164 小A点菜 && caioj 1410 动态规划1:点菜(背包方案问题)
  8. JS 中深拷贝的几种实现方法
  9. HBase快照、Snapshots 淘宝快照
  10. [React Native] Use the SafeAreaView Component in React Native for iPhone X Compatibility