【题解】括号染色

这是一道关于括号序列涂色问题的算法题。给定一个正确的括号序列,需要找出所有满足特定条件的涂色方案。题目要求一对匹配的括号中只能有一个涂色,且相邻的括号不能涂相同颜色。通过预处理和递归转移来计算方案数,最终对1e9+7取模得到答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

Petya遇到了一个关于括号序列的问题:
给定一个字符串S,它代表着正确的括号序列,即(“(”)与 (“)”)是匹配的。例如:“(())()” 和 “()”是正确的,“)()”与“(()”则不是正确的。
在正确的括号序列中,一个左边的括号一定是匹配一个右边的括号(反之亦然)。例如,在下图中,第 3 个括号匹配第 6 个括号,第 4 个括号匹配第 5 个括号。

18f69b22b88c3423241947f144f2105947738984.png

现在你需要对一个正确的括号序列做涂色操作,严格满足以下三个条件:

  1. 每个括号要么不涂色,要么涂红色,要么涂蓝色。

  2. 一对匹配的括号需要且只能将其中一个涂色。

  3. 相邻的括号不能涂上同一种颜色(但是可以都不涂颜色)。

求:给整个括号序列涂上颜色的方案数,答案可能比较大,对 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 x1 y − 1 y-1 y1,再根据边界的染色情况进行转移。
match[x]!=y 时,先分别处理 x x xmatch[x]match[x]+1 y y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值