链接:https://ac.nowcoder.com/acm/problem/21652
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
牛牛最近开始学括号匹配拉
给你两个括号序列,不保证合法,求有多少种不同的方法可以将两个括号序列合并成一个合法的括号序列
合并的时候不能改变各自序列原先的顺序
输入描述:
输入两行包含两个字符串s1,s2 1 ≤ |s1|,|s2| ≤ 2500
输出描述:
输出一个整数,魔109+7
示例1
输入
复制
(() ())
输出
复制
19
说明
示例2
输入
复制
()()()()()()()()()()()()()()()()()()()() ()()()()()()()()()()()()()()()()()
输出
复制
487340184
示例3
输入
复制
((((( )))))
输出
复制
42
示例4
输入
复制
(())()))) (())()
输出
复制
0
备注:
子任务一30分:max(|s1|,|s2|)<=10 子任务二30分:max(|s1|,|s2|)<=100 子任务三40分:max(|s1|,|s2|)<=2500
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
char a[2505],b[2505];
int dp[2505][2505];
int fa[2505],fb[2505];
int main(){
scanf("%s%s",a+1,b+1);
int la=strlen(a+1);
int lb=strlen(b+1);
for(int i=1;i<=la;i++) fa[i]=fa[i-1]+(a[i]=='('?1:-1);
for(int j=1;j<=lb;j++) fb[j]=fb[j-1]+(b[j]=='('?1:-1);
dp[0][0]=1;
for(int i=0;i<=la;i++){
for(int j=0;j<=lb;j++){
if(i==0&&j==0) continue;
if(fa[i]+fb[j]<0) continue;
if(i) dp[i][j]+=dp[i-1][j];
if(j) dp[i][j]+=dp[i][j-1];
dp[i][j]%=mod;
}
}
if(fa[la]+fb[lb]==0) printf("%d\n",dp[la][lb]);
else printf("0\n");
return 0;
}