1 条题解

  • 0
    @ 2025-10-23 20:46:31

    题解

    问题分析

    题目要求统计满足特定扫描模式的合法表格数量。扫描模式为:

    • 在第 pp 列扫描时,覆盖区域包括:
      • pp 列全部 kk 个格子
      • p1p-1 列的前 k1k-1 个格子
      • p2p-2 列的前 k2k-2 个格子
      • ...
    • 给定每列的扫描结果 bpb_p,求满足所有扫描结果的 k×nk \times n 表格数量

    关键观察

    1. 扫描区域的递推关系

      • pp 列的扫描区域 = 第 p1p-1 列的扫描区域去掉最后一行的格子 + 第 pp 列的全部格子
      • 这形成了相邻列扫描结果之间的约束关系
    2. 状态设计

      • 使用 DP 状态记录每列各行的矿物情况
      • 由于 k7k \leq 7,可以用 kk 个变量表示当前列的矿物分布
      • 状态转移时考虑相邻列之间的重叠部分

    算法思路

    动态规划(按列递推)

    1. 状态表示

      • dp[now][a][b][c][d][e][f][g] 表示处理到第 now 列时,各行的"影响值"
      • 对于 kk 行,第 ii 个状态变量表示扫描区域中来自前 ii 列的矿物数量贡献
    2. 状态转移

      • 从第 now-1 列的状态转移到第 now
      • 枚举当前列每行的矿物情况(0或1)
      • 计算新的扫描值并检查是否等于 x[now]x[now]
      • 更新 DP 状态
    3. 初始化和答案

      • 初始化第一列的所有可能矿物分布
      • 最终答案是最后一列满足扫描值等于 x[n]x[n] 的所有状态之和

    核心技巧

    1. 状态压缩:用多个维度的 DP 数组表示各行的累积影响
    2. 滚动思想:实际代码中按列顺序递推,隐含了滚动数组
    3. 边界处理:对不同的 kk 值分别处理,避免无效状态

    复杂度分析

    • 状态数O(n×2k×kk)O(n \times 2^k \times k^k),但由于 k7k \leq 7 且很多状态不可达,实际可接受
    • 转移复杂度O(2k)O(2^k) 枚举当前列状态
    • 总复杂度O(n×22k×kk)O(n \times 2^{2k} \times k^k),在给定范围内可行

    算法步骤

    1. 读入 n,kn, k 和扫描结果数组 xx
    2. 根据 kk 值选择对应的 DP 分支
    3. 初始化第一列的状态
    4. 按列递推,维护合法的状态数量
    5. 统计最后一列满足条件的答案

    算法标签

    • 动态规划
    • 状态压缩
    • 组合计数
    • 递推关系
    • 位运算枚举
    • 1

    信息

    ID
    3930
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者