2 条题解
-
0
本题的核心要求是计算删除元素后能得到多少种不同的矩阵。
在 矩阵的某一行中,删除一个元素后得到的剩余字符串,仅与被删除元素所在的 “连续相同字符块” 有关。例如,对于字符串
00100,删除第一个0或第二个0得到的字符串都是0100。为了避免重复计数,我们需要为每一种合法的矩阵对应一个唯一的删除路径。对于任意一个合法的目标矩阵,可能存在多条满足 的路径 。
在所有能生成同一个矩阵的路径中,必然存在一条在各个位置上取值尽可能大的“最右路径”。这条唯一的最大路径满足以下右紧凑条件:
对于每一行 ,设删除的位置为 ,以下三个条件中至少有一个成立:
- 是当前连续字符块的最右侧元素(即 或 )。
- 且 (受限于左侧的最大跨度,无法再往右移动)。
- 且 (受限于右侧的最大跨度,无法再往右移动)。
我们将 “ 是当前块的最右侧元素” 记为布尔条件 。那么约束可以转化为:每个位置 必须满足 $P(i, a_i) \lor (a_i - a_{i-1} == K) \lor (a_i - a_{i+1} == K)$。
我们可以设计一个动态规划来统计满足上述 “右紧凑条件” 的路径数量。
定义状态 表示处理到第 行,第 行删除的列索引为 时的合法路径数。其中第三维表示前缀是否已经满足了第 行的条件。
- :表示 为真( 为上一行选择的列),即仅靠 行本身及之前的选择已经满足条件,不需要第 行来拯救。
- :表示前缀未能满足条件。此时必须利用第 行来满足,强制要求 ,即 。
设上一行选择的列尾 :
如果上一行的状态是 ,则强制要求当前行的列 必须满足 ,即 。
这部分转移的方案数记为 。
如果上一行的状态是 ,上一行已满足条件,当前行 可以任意选取满足 的位置。
这部分的方案数之和为 。
对于当前行来说,如果 为真,无论上一行怎么选,当前行都满足条件,因此:
$$\begin{aligned}f[i][j][1]&=(sum+x)\pmod{10^9+7}\\f[i][j][0]&=0\end{aligned}$$如果 为假,当前行要满足条件,必须依赖 ,即 。这部分的方案数为 。其余情况都会导致当前行不满足条件:
$$\begin{aligned}f[i][j][1]&=y\pmod{10^9+7}\\f[i][j][0]&=(sum-y+x)\pmod{10^9+7}\end{aligned}$$由于 ,整体时间复杂度为 。
可以使用滚动数组优化,空间复杂度为 。当然不优化也可以。
- 1
信息
- ID
- 2723
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 15
- 已通过
- 5
- 上传者