本文最后更新于 9 个月前,文中所描述的信息可能已发生改变。
C. Beautiful Sequence 解题思路
摘要与问题转化
本题要求在一个仅包含数字 $ 1, 2, 3$ 的序列中,计算“完美子序列”的数量。一个完美子序列定义为形如 $ 1, 2, \dots, 2, 3$ 的序列,即以 $ 1$ 开头、以 $ 3$ 结尾,中间可以包含零个或多个 $ 2$。
由于序列的结构非常明确,我们不需要关注 的具体数量,只需要统计以 结尾的子序列数量、以 结尾的子序列数量以及以 结尾的(即完美)子序列数量。当遍历到当前的数字 时,它可以通过衔接一个以 结尾的子序列,从而形成新的以 结尾的子序列。同时,如果 ,它可以衔接任何一个已存在的以 结尾的子序列,从而生成新的以 结尾的子序列。
主体分析:动态规划策略
1. 状态定义
我们采用动态规划(Dynamic Programming, DP)来解决这个问题,其时间复杂度为 ,可以满足 的数据规模要求。
定义 为:以数字 结尾的合法子序列的数量。其中 。
- :辅助状态,初始化为 。它表示一个“空子序列”或“起始点”。当遇到 时,新的以 结尾的子序列数量可以从这个起始点计数 开始。
2. 状态转移方程
我们遍历输入的序列,对于当前的数字 :
A. 特殊情况:数字 的自我转移
数字 具有特殊的性质,它可以接在任何一个已存在的以 结尾的子序列后面,形成一个新的以 结尾的子序列。
如果当前读入的数字 ,则:
这个操作表示:对于已有的 个以 结尾的子序列,新的 都可以接在它们后面,使得数量翻倍。由于 的自我衔接不依赖于 的转移,因此应先进行。