本文主要是介绍【题解】括号染色,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述
Petya遇到了一个关于括号序列的问题:
给定一个字符串S,它代表着正确的括号序列,即(“(”)与 (“)”)是匹配的。例如:“(())()” 和 “()”是正确的,“)()”与“(()”则不是正确的。
在正确的括号序列中,一个左边的括号一定是匹配一个右边的括号(反之亦然)。例如,在下图中,第 3 个括号匹配第 6 个括号,第 4 个括号匹配第 5 个括号。
现在你需要对一个正确的括号序列做涂色操作,严格满足以下三个条件:
-
每个括号要么不涂色,要么涂红色,要么涂蓝色。
-
一对匹配的括号需要且只能将其中一个涂色。
-
相邻的括号不能涂上同一种颜色(但是可以都不涂颜色)。
求:给整个括号序列涂上颜色的方案数,答案可能比较大,对 1 e 9 + 7 1e9+7 1e9+7 取模。
题解
用 dp[x][y][i][j]
表示 x x x 到 y y y 这个区间左端点染 i i i,右端点染 j j j 的方案数。首先用栈预处理出每个左端点对应的右端点,然后转移的时候考虑三种情况:
区间长度为 2 2 2,这时候枚举 4 4 4 种染色情况,每种方案都是 1 1 1。
match[x]==y
时,先处理 x − 1 x-1 x−1 到 y − 1 y-1 y−1,再根据边界的染色情况进行转移。
match[x]!=y
时,先分别处理 x x x 到 match[x]
和 match[x]+1
到 y y
这篇关于【题解】括号染色的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!