题目链接:http://codeforces.com/problemset/problem/149/D
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
#include <cstdlib>
#define sf scanf
#define pf printf
using namespace std;
typedef __int64 LL;
const LL mod = 1000000000 + 7;
const int maxn = 705;
char str[maxn];
LL dp[maxn][maxn][3][3];
int next[maxn];
LL DFS(int l,int r,int st1,int st2){
if(l > r) return 1;
LL &ans = dp[l][r][st1][st2];
if(ans != -1) return ans;
int p = next[l];ans = 0;
if(l + 1 == r){
ans = 4 - (st1 != 0) - (st2 != 0);
}
else if(p == r){
if(st1 != 1) ans += DFS(l + 1,p - 1,1,0);
if(st1 != 2) ans += DFS(l + 1,p - 1,2,0);
if(st2 != 1) ans += DFS(l + 1,p - 1,0,1);
if(st2 != 2) ans += DFS(l + 1,p - 1,0,2);
}
else{
if(st1 != 1) ans = (ans + DFS(l + 1,p - 1,1,0) * DFS(p + 1,r,0,st2)) % mod;
if(st1 != 2) ans = (ans + DFS(l + 1,p - 1,2,0) * DFS(p + 1,r,0,st2)) % mod;
ans = (ans + DFS(l + 1,p - 1,0,1) * DFS(p + 1,r,1,st2)) % mod;
ans = (ans + DFS(l + 1,p - 1,0,2) * DFS(p + 1,r,2,st2)) % mod;
}
ans = ans % mod;
return ans;
}
int main(){
while(~sf("%s",str)){
stack<int> St;
memset(dp,(-1ll),sizeof dp);
int len = strlen(str);
for(int i = 0;i < len;++i){
if(str[i] == '(') St.push(i);
else{
next[St.top()] = i;
St.pop();
}
}
cout << DFS(0,len - 1,0,0) << endl;
}
return 0;
}