Codeforces 149D Coloring Brackets

来源:互联网 发布:试玩软件赚钱 编辑:程序博客网 时间:2024/05/18 00:51
/* 题目大意:给定括号序列,可以将任意部分染成红色,蓝色或不染色 任意配对的序列有且只有一个被染色,任意相邻的两个括号颜色不同 设计dp[i][j][p][q],i,j配对,并对应[p][q]状态的方法数. 递推方程很好设计,注意dp的写法 */#include <cstdio>#include <cstring>#define LL long longconst int mod = 1e9 + 7;#define maxn 777LL dp[maxn][maxn][3][3];int match[maxn];int stack[maxn];char str[maxn];int len;void make_match(){    int top=0;    for(int i=0;i<len;i++)    {        if(str[i]=='(')        {            stack[top++]=i;        }        else        {            match[i]=stack[top-1];            match[stack[top-1]]=i;            top--;        }    }}void dfs(int l,int r){    if(l+1==r)    {        dp[l][r][0][1]=1;        dp[l][r][0][2]=1;        dp[l][r][1][0]=1;        dp[l][r][2][0]=1;        return;    }    if(match[l]==r)    {        dfs(l+1,r-1);        for(int i=0;i<3;i++)        {            for(int j=0;j<3;j++)            {                if(j!=1)  dp[l][r][0][1]=(dp[l][r][0][1]+dp[l+1][r-1][i][j])%mod;                if(i!=1)  dp[l][r][1][0]=(dp[l][r][1][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;                if(i!=2)  dp[l][r][2][0]=(dp[l][r][2][0]+dp[l+1][r-1][i][j])%mod;            }        }    }    else    {        int loc=match[l];        dfs(l,loc);        dfs(loc+1,r);        for(int i=0;i<3;i++)        {            for(int j=0;j<3;j++)            {                for(int k=0;k<3;k++)                {                    for(int p=0;p<3;p++)                    {                        if(!((k==1&&p==1)||(k==2&&p==2)))                        {                            dp[l][r][i][j]=(dp[l][r][i][j]+(dp[l][loc][i][k]*dp[loc+1][r][p][j])%mod)%mod;                        }                    }                }            }        }    }    return;}int main(){    scanf("%s",str);    len=(int)strlen(str);    memset(dp,0,sizeof(dp));    memset(match,0,sizeof(match));    make_match();    dfs(0,len-1);    LL ans=0;    for(int i=0;i<3;i++)    {        for(int j=0;j<3;j++)        {            ans=(ans+dp[0][len-1][i][j])%mod;        }    }    printf("%lld\n",ans);    return 0;}

0 0
原创粉丝点击