CF149D

Coloring Brackets

题面翻译

题意描述

给出一个配对的括号序列(如 “\(\texttt{(())()}\)”、“\(\texttt{()}\)” 等,“\(\texttt{)()}\)”、“\(\texttt{(()}\)”是不符合要求的),对该序列按照以下方法染色。

  1. 一个括号可以染成红色、蓝色或者不染色。
  2. 一对匹配的括号需要且只能将其中一个染色。
  3. 相邻两个括号颜色不能相同(但都可以不染色)。

求符合条件的染色方案数,对 \(1000000007\) 取模。

输入格式

一行一个字符串 \(s\),表示括号序列(\(2 \leqslant |s| \leqslant 700\))。

输出格式

一个数字,表示染色的方案数(对 \(1000000007\) 取模)。

输入格式

The first line contains the single string $ s $ ( $ 2<=|s|<=700 $ ) which represents a correct bracket sequence.

输出格式

Print the only number — the number of ways to color the bracket sequence that meet the above given conditions modulo $ 1000000007 $ ( $ 10^{9}+7 $ ).

样例 #1

样例输入 #1

(())

样例输出 #1

12

样例 #2

样例输入 #2

(()())

样例输出 #2

40

样例 #3

样例输入 #3

()

样例输出 #3

4

提示

Let's consider the first sample test. The bracket sequence from the sample can be colored, for example, as is shown on two figures below.

The two ways of coloring shown below are incorrect.

这题要做的话要用区间DP
先挂着吧 以后补
暴力搜索代码
TLE
#include<bits/stdc++.h>
using namespace std;
string s;
#define mod 1000000000+7
int len;int loc[705];
int st[705],pt=0,cnt,vis[705];
void dfs(int pos,int co)
{
	if(pos==len+1)
	{
//		for(int i=1;i<=len;i++)cout<<vis[i]<<' ';cout<<"\n";
		cnt++;
		cnt%=mod;
		return ;
	}
	int pre=loc[pos];
//	cout<<pos<<" "<<pre<<"\n";
	if(pre<pos&&vis[pre]==0)
	{
		if(co==0)
		{
			vis[pos]=1;
			dfs(pos+1,1);
			vis[pos]=-1;
			vis[pos]=2;
			dfs(pos+1,2);
			vis[pos]=-1;
		}
		if(co==1)
		{
			vis[pos]=2;
			dfs(pos+1,2);
			vis[pos]=-1;
		}
		if(co==2)
		{
			vis[pos]=1;
			dfs(pos+1,1);
			vis[pos]=-1;
		}
	}
	if(pre<pos&&vis[pre]>0)
	{
		vis[pos]=0;
		dfs(pos+1,0);
		vis[pos]=-1;
	}
	if(pre>pos)
	{
		if(co==0||co==-1)
		{
			vis[pos]=0;
			dfs(pos+1,0);
			vis[pos]=-1;
			vis[pos]=1;
			dfs(pos+1,1);
			vis[pos]=-1;
			vis[pos]=2;
			dfs(pos+1,2);
			vis[pos]=-1;
		}
		else
		{
			if(co==1)
			{
				vis[pos]=0;
				dfs(pos+1,0);
				vis[pos]=-1;
				vis[pos]=2;
				dfs(pos+1,2);
				vis[pos]=-1;
			}
			if(co==2)
			{
				vis[pos]=0;
				dfs(pos+1,0);
				vis[pos]=-1;
				vis[pos]=1;
				dfs(pos+1,1);
				vis[pos]=-1;
			}
			
		}
	}
	
	
	
	
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>s;
	len=s.size();
	s=" "+s;
	memset(vis,-1,sizeof(vis));
	for(int i=1;i<=len;i++)
	{
		if(s[i]=='(')st[++pt]=i;
		else
		{
			loc[i]=st[pt];
			loc[st[pt]]=i;
			pt--;
		}
	}
//	for(int i=1;i<=len;i++)cout<<loc[i]<<" ";cout<<"\n";
	dfs(1,-1);
	cout<<cnt<<"\n";
	return 0;
}
posted @ 2023-01-10 18:58  PKU_IMCOMING  阅读(12)  评论(0)    收藏  举报