括号上色

简介: 小艺酱又得到了一堆括号。括号是严格匹配的。现在给括号进行上色。上色有三个要求:1、只有三种上色方案,不上色,上红色,上蓝色。2、每对括号只有一个上色。3、相邻的两个括号不能上相同的颜色,但是可以都不上色。问括号上色有多少种方案?答案对1000000007取模。

括号上色

小艺酱又得到了一堆括号。
括号是严格匹配的。
现在给括号进行上色。
上色有三个要求:
1、只有三种上色方案,不上色,上红色,上蓝色。
2、每对括号只有一个上色。
3、相邻的两个括号不能上相同的颜色,但是可以都不上色。
问括号上色有多少种方案?答案对1000000007取模。

输入描述:

输入括号序列s。(2<=|s|<=700)

输出描述:

输出方案数。

输入样例:

(())

输出样例:

12

代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define LL long long
const int mod=1000000007;

char s[1000];
int q[1000];
int mp[1000]={0};
int tot=1;
LL dp[1000][1000][3][3]={0};
int vis[1000][1000]={0};

int dfs(int L, int R)
{
    if(vis[L][R])
    {
        return 0;
    }
    vis[L][R]=1;
    if(R-L==1)
    {
        dp[L][R][1][0]=1, dp[L][R][2][0]=1;
        dp[L][R][0][1]=1, dp[L][R][0][2]=1;
        return 0;
    }
    if(mp[L]==R)
    {
        dfs(L+1, R-1);
        for(int u=0;u<3;u++)
        {
            for(int v=0;v<3;v++)
            {
                for(int x=0;x<3;x++)
                {
                    for(int y=0;y<3;y++)
                    {
                        if((u==0||v==0)&&(u!=0||v!=0)&&(u!=x||u+x==0)&&(v!=y||v+y==0))
                        {
                            dp[L][R][u][v]+=dp[L+1][R-1][x][y], dp[L][R][u][v]%=mod;
                        }
                    }
                }
            }
        }
    }
    else
    {
        dfs(L, mp[L]); dfs(mp[L]+1, R);
        for(int u=0;u<3;u++)
        {
            for(int v=0;v<3;v++)
            {
                for(int x=0;x<3;x++)
                {
                    for(int y=0;y<3;y++)
                    {
                        if((u==0||v==0)&&(u!=0||v!=0)&&(v!=x||v==0&&x==0))
                        {
                            dp[L][R][u][y]+=dp[L][mp[L]][u][v]*dp[mp[L]+1][R][x][y], dp[L][R][u][y]%=mod;
                        }
                    }
                }
            }
        }
    }
    
}

int main()
{
    int len,ans = 0;
    scanf("%s",s+1);
    len = strlen(s+1);
    for(int i=1;i<=len;i++)
    {
        if(s[i]=='(')
        {
            q[tot++]=i;
        }
        else
        {
            mp[q[--tot]]=i;
        }
    }
    dfs(1, len);
    for(int u=0;u<3;u++)
    {
        for(int v=0;v<3;v++)
        {
            ans+=dp[1][len][u][v], ans%=1000000007;
        }
    }
    printf("%d",ans);
    return 0;
}


相关文章
|
1天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1060 0
|
10天前
|
人工智能 运维 安全
|
1天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
242 0
|
8天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
9天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
736 23