为什么会UKE
查看原帖
为什么会UKE
810054
suzichen03楼主2024/4/13 16:50

就像这样

源代码如下

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
const int mod = 1000000007;
int len, p[705];
int dp[75][75][3][3];
string s;
stack <int> st;
void dfs(int l, int r)
{
	if(l + 1 == r)
	{
		dp[l][r][0][2] = dp[l][r][2][0] = dp[l][r][0][1] = dp[l][r][1][0] = 1;
		return ;
	}
	else if(p[l] == r)
	{
		dfs(l + 1, r - 1);
		for(int i = 0; i <= 2; i++)
		{
			for(int j = 0; j <= 2; j++)
			{
				if(i != 1) dp[l][r][1][0] = (dp[l][r][1][0] + dp[l + 1][r - 1][i][j]) % mod;
				if(j != 1) dp[l][r][0][1] = (dp[l][r][0][1] + dp[l + 1][r - 1][i][j]) % mod;
				if(i != 2) dp[l][r][2][0] = (dp[l][r][2][0] + dp[l + 1][r - 1][i][j]) % mod;
				if(j != 2) dp[l][r][0][2] = (dp[l][r][0][2] + dp[l + 1][r - 1][i][j]) % mod;
			}
		}
	}
	else
	{
		dfs(l, p[l]);
		dfs(p[l] + 1, r);
		for(int i = 0; i <= 2; i++)
		{
			for(int j = 0; j <= 2; j++)
			{
				for(int k = 0; k <= 2; k++)
				{
					for(int x = 0; x <= 2; x++)
					{
						if((j == 2 && k == 2) || (j == 1 && k == 1))
						{
							continue;
						} 
						dp[l][r][i][x] = (dp[l][r][i][x] + dp[l][p[l]][i][j] * dp[p[l] + 1][r][k][x]) % mod;
					}
				}
			}
		}
	}
	return ;
}
int main()
{
	ios::sync_with_stdio(false);
	cin >> s;
	len = s.size();
	s = ' ' + s;
	for(int i = 1; i <= len; i++)
	{
		if(s[i] == '(')
		{
			st.push(i);
		}
		else if(s[i] == ')')
		{
			p[st.top()] = i;
			p[i] = st.top();
			st.pop();
		}
	}
	dfs(1, len);
	int ans = 0;
	for(int i = 0; i <= 2; i++)
	{
		for(int j = 0; j <= 2; j++)
		{
//			cout << dp[1][len][i][j] << " ";
			ans = (ans + dp[1][len][i][j]) % mod;
		}
//		cout << '\n';
	}
	cout << ans;
	return 0;
}
//////////////////////////////////////
2024/4/13 16:50
加载中...