(每日一练28815)题目名称:括号上色

文盲老顾
WEB应用领新星创作者
博客专家认证
2023-06-16 14:21:48

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

老顾自己是没什么思路的,看了看别人的题解,大体上说这个是一个 CodeForces 的原题,嗯,所以 C 站的描述错误,每对括号只能且必须有一个上色。

这里推荐几个小伙伴的题解,要么 dfs,要么 dp,反正老顾不懂,以下题解老顾验证过了,可以 AC。

问哥的题解:https://blog.csdn.net/soonway2010/article/details/128165678

H_ang的题解:https://blog.csdn.net/qq_21433411/article/details/94434739

然后,老顾又一次特立独行,和小伙伴们的办法都不一致,根据这几个小伙伴的答案,反推了一种系数计算方式

老顾的思路也很简单 () 一定是4种组合 ((())) 每嵌套一层,组合数乘3,得到36,对于 ()()() 来说,有一个乘法系数,目前代码里也有相关计算,计算出系数,然后相乘,就可以得到结果

最后的混合嵌套:(()()) 这种嵌套方式的系数,是根据内部包含的分组()()()数量来确定的,只有一组,那就是3,反正,根据数量得出新的系数

import re
s = input()
v = [[8,7,20],[7,6,17]]
def fs(m):
    return str(int(m.group(1)) * 3) + ' '
def add(n):
    if n < len(v):
        return
    for i in range(len(v),n):
        if i % 2 == 0:
            v.append([8 * v[-1][1],8 * v[-1][1] - v[-1][0]])
            v[-1].append(3 * v[-1][1] - v[i - 2][1])
        else:
            v.append([v[-1][1],v[-1][1] - v[i - 2][1]])
            v[-1].append(v[-2][2] - v[i - 2][2])
def x(m):
    f = 1
    row = list(map(int,m.group(2).split()))
    add(len(row))
    for i,val in enumerate(row):
        f *= val
        if i > 0:
            f //= v[i - 1][0]
            f *= v[i - 1][1]
    if m.group(1) == '(':
        f //= v[i - 1][1]
        f *= v[i - 1][2]
    return str(f) + ' '
ss = re.sub(r'(\(\))','4 ',s)
while not re.search(r'^\d+\s*$',ss):
    while re.search(r'\([\d]+ \)',ss):
        ss =re.sub(r'\(([\d]+ )\)',fs,ss)
    ss = re.sub(r'(^|\()([\d\s]+)($|\))',x,ss)
print(int(ss) % 1000000007)
...全文
247 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

321

社区成员

发帖
与我相关
我的任务
社区描述
主要用于技术交流,包括但不限于 .net,mssql,js,css,python,算法,运维。也可以晒最新技术,美图,运动等。最后,如果有问题,可以提问,老顾能帮忙的会尽量帮忙哦。
前端sqlserverasp.net 技术论坛(原bbs) 北京·西城区
社区管理员
  • 文盲老顾
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧