321
社区成员




小艺酱又得到了一堆括号。 括号是严格匹配的。 现在给括号进行上色。 上色有三个要求: 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)