Guest User

Untitled

a guest
Jun 22nd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <stack>
  5. #include <algorithm>
  6. #include <bitset>
  7. #include <math.h>
  8. #include <queue>
  9. #include <map>
  10. #include <set>
  11. #include <limits.h>
  12. #include <limits>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <cstring>
  16. #include <sstream>
  17. #include <string.h>
  18. #define MOD 1000000007
  19. using namespace std;
  20. char s[700];
  21. int N, m[700];
  22. int dp[705][705][3][3];
  23. stack <int> st;
  24. int dfs(int l, int r, int cl, int cr){
  25.     if(dp[l][r][cl][cr] != -1)return dp[l][r][cl][cr];
  26.     if(l > r)return 1;
  27.     int k = m[l];
  28.     long long res = 0;
  29.     if(k == r){
  30.         for(int i = 0; i <= 2; i++)
  31.         for(int j = 0; j <= 2; j++)
  32.             if((i == 0) ^ (j == 0) && (cl != i || cl == 0) && (cr != i || cl == 0))
  33.                 res = (res + dfs(l + 1, r - 1, i, j)) % MOD;
  34.     }else{
  35.         for(int i = 0; i <= 2; i++)
  36.         for(int j = 0; j <= 2; j++)
  37.             if((i == 0) ^ (j == 0) && (cl != i || cl == 0))
  38.                 res = (res + (long long)dfs(l + 1, k - 1, i, j) * dfs(k + 1, r, j, cr)) % MOD;
  39.     }
  40.     return dp[l][r][cl][cr] = res;
  41. }
  42. int main(){
  43.     scanf("%s", &s);
  44.     N = strlen(s);
  45.     for(int i = 0; i < N; i++){
  46.         if(s[i] == '(')
  47.             st.push(i);
  48.         else{
  49.             int k = st.top();
  50.             st.pop();
  51.             m[k] = i;
  52.             m[i] = k;
  53.         }
  54.     }
  55.     memset(dp, -1, sizeof dp);
  56.     printf("%d\n", dfs(0, N - 1, 0, 0));
  57.     return 0;
  58. }
Add Comment
Please, Sign In to add comment