Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define endl "\n"
- using namespace std;
- const int MOD = 1000000007;
- int n,m,k;
- char a[1<<17];
- bool vis[2044][5111][2];
- int dp_ans[2044][5111][2];
- int s[1<<17],min_s;
- int get_dp(int pos, int sum, bool f) {
- if(sum>2000 || sum<0) return 0;
- if(pos>k) {
- if(f==false) {
- if(sum+min_s>=0 && sum+s[m]==0) return 1;
- else return 0;
- }
- else {
- if(sum==0) return 1;
- else return 0;
- }
- }
- if(vis[pos][sum][f]) return dp_ans[pos][sum][f];
- int ans=0;
- ans=(ans+get_dp(pos+1,sum+1,f))%MOD;//Open
- ans=(ans+get_dp(pos+1,sum-1,f))%MOD;//Close
- if(f==false) {
- if(sum+min_s>=0) ans=(ans+get_dp(pos,sum+s[m],1))%MOD;//Skip;
- }
- vis[pos][sum][f]=true;
- dp_ans[pos][sum][f]=ans;
- return ans;
- }
- int main() {
- cin.tie(NULL);
- ios::sync_with_stdio(0);
- int i;
- cin>>n>>m;
- k=n-m;
- cin>>(a+1);
- for(i=1;i<=m;i++) if(a[i]=='(') s[i]=1; else s[i]=-1;
- for(i=1;i<=m;i++) s[i]+=s[i-1];
- min_s=1000000000;
- for(i=1;i<=m;i++) min_s=min(min_s,s[i]);
- cout<<get_dp(1,0,0)<<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement