1 条题解
-
0
题意回顾
求长度为 ,每个元素在 间的序列数目,使得序列可以通过若干次"删除两端相等且长度至少为 的区间"操作被完全删除。
答案对 取模。
数据范围:,。
问题分析
1. 可删除序列的特征
这种序列具有类似合法括号序列的结构,但每个"括号"可以是 种不同的"颜色"。
序列可被完全删除的充要条件是:存在一种方式将序列分成若干对 ,满足:
- 这些配对形成合法的嵌套结构(无交叉)
换句话说,序列必须能够被解析为一个合法的彩色括号序列。
动态规划解法
状态设计
设 表示考虑前 个位置,当前有 个开括号(未匹配的左括号)未匹配的方案数。
这里 表示当前前缀中尚未找到匹配的彩色左括号数量。
转移方程
对于每个状态 ,考虑第 个位置的选择:
-
新增一个开括号(左括号):
- 可以选择任意颜色,有 种选择
- 转移:$dp[i+1][j+1] \leftarrow dp[i+1][j+1] + dp[i][j] \times m$
-
匹配一个开括号(右括号):
- 需要 ,即至少有一个未匹配的开括号
- 可以选择任意一个未匹配的开括号进行匹配,有 种选择
- 转移:$dp[i+1][j-1] \leftarrow dp[i+1][j-1] + dp[i][j] \times j$
初始条件
- (空序列,没有未匹配的括号)
- 其他状态初始为
最终答案
序列完全匹配的条件是所有开括号都被匹配,即 。
答案:
算法实现
步骤
- 初始化
- 对于 从 到 :
- 对于 从 到 :
- 如果 :
- 新增开括号:$dp[i+1][j+1] = (dp[i+1][j+1] + dp[i][j] \times m) \bmod MOD$
- 匹配开括号:如果 ,则 $dp[i+1][j-1] = (dp[i+1][j-1] + dp[i][j] \times j) \bmod MOD$
- 如果 :
- 对于 从 到 :
- 输出
复杂度分析
- 状态数:
- 每个状态转移:
- 总时间复杂度:
- 空间复杂度:
对于 ,状态数最多约 ,完全可行。
正确性说明
这种解法正确的原因是:
-
状态设计合理: 精确地表示了当前未匹配的开括号数量,这完全对应了序列解析过程中的栈深度。
-
转移完整:
- 新增开括号对应在序列中添加一个任意颜色的新元素
- 匹配开括号对应找到一个与之前某个未匹配元素颜色相同的元素
-
边界处理正确:
- 初始状态表示空序列是合法的
- 最终状态要求所有开括号都被匹配
-
覆盖所有情况:任何可删除序列都对应一种合法的括号解析方式,反之亦然。
总结
本题的关键在于将可删除序列问题转化为带颜色的合法括号序列计数问题:
- 核心思路:使用二维DP跟踪未匹配的开括号数量
- 状态设计: 表示前 个位置有 个未匹配开括号
- 转移策略:每次可以新增开括号或匹配一个开括号
- 复杂度: 时间, 空间
- 适用范围:完美匹配 的数据范围
- 1
信息
- ID
- 4345
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 6
- 已通过
- 1
- 上传者