死循环求助(仅最后一个点)
查看原帖
死循环求助(仅最后一个点)
531776
LYM20114楼主2022/12/23 17:13

当l = 38,r = 41时就一直卡在里面 样例:()()()((((())))())()()()()()((()))()()(())()(((())))()(()())((())())((()())(((((()()()())()()())))))

#include <iostream>
#include <stack>
#include <string>
#include <cstring>
using namespace std;
const long long MOD = 1000000007;
string x2;
int len;
stack <int> st;
long long f[705][705][3][3],sum;
int match[705];
int rev(int x1){
	if(x1 == 1) return 2;
	else return 1;
}
int dp(int l,int r,int x,int y){
    if(f[l][r][x][y] > -1) return f[l][r][x][y];
	if(l == r - 1){
		f[l][r][x][y] = ((x > 0) != (y > 0));
		return f[l][r][x][y];
	}
	f[l][r][x][y] = 0;
	if(r == match[l]){
		if((x && y) || (!x && !y)) return f[l][r][x][y] = 0;
		if(x == 0) return f[l][r][x][y] = (dp(l + 1,r - 1,1,0) + dp(l + 1,r - 1,2,0) + dp(l + 1,r - 1,0,0) + dp(l + 1,r - 1,0,rev(y)) + dp(l + 1,r - 1,1,rev(y)) + dp(l + 1,r - 1,2,rev(y))) % MOD;
		if(y == 0) return f[l][r][x][y] = (dp(l + 1,r - 1,0,1) + dp(l + 1,r - 1,0,2) + dp(l + 1,r - 1,0,0) + dp(l + 1,r - 1,rev(x),0) + dp(l + 1,r - 1,rev(x),1) + dp(l + 1,r - 1,rev(x),2)) % MOD;
	}
	else{
		for(int i = 0;i <= 2;i++)
			for(int j = 0;j <= 2;j++)
				f[l][r][i][j] = 0;
		for(int i = 0;i <= 2;i++)
			for(int j = 0;j <= 2;j++)
				for(int p = 0;p <= 2;p++)
					for(int q = 0;q <= 2;q++){
						if(j && p && (j == p)) continue;
						f[l][r][i][q] = (f[l][r][i][q] + dp(l,match[l],i,j) * dp(match[l] + 1,r,p,q) % MOD) % MOD;
					}
//		if(l == 38 && r == 41){
//			cout << f[l][r][x][y] << endl;
//		}
//		if(l == 42 && r == 99){
//			cout << f[l][r][x][y] << endl;
//		}
		return f[l][r][x][y];
	}
}
int main(){
	memset(f,-1,sizeof f);
	cin >> x2;
	len = x2.size();
	for(int i = 0;i < len;i++){
		if(x2[i] == '('){
			st.push(i);
		}
		else {
			int n = st.top();
			st.pop();
			match[n] = i;
		}
	}
	for(int i = 0;i <= 2;i++)
		for(int j = 0;j <= 2;j++)
			sum = (sum + dp(0,len - 1,i,j)) % MOD;
	cout << sum;
    return 0;
}
2022/12/23 17:13
加载中...