1 条题解

  • 0
    @ 2025-11-27 15:05:36

    🔍 题目关键性质与约束

    解决此题,首先要理解清楚金字塔的构造规则:

    1. 基本单位:金字塔由 1×1×11 \times 1 \times 1 的立方体石块构成。
    2. 分层结构:金字塔有 hh 层,从下往上编号(第1层是最底层)。每层是一个联通块,且高层石块必须有低层石块作为支撑(不能悬空)。
    3. 对称性:每一层都满足严格的左右对称和上下对称,并且所有层的对称轴是重合的。
    4. 尺寸要求:每一层的最大长度和最大宽度相等,且为偶数。题目会给出从底层开始的每一层的最大长度 lil_i,且 lil_i 非严格递减
    5. 总石块数:金字塔的总石块数等于 nn

    数据范围

    • n1000n \leq 1000
    • 2l202 \leq l \leq 20
    • 1h101 \leq h \leq 10
    • 答案对 10000000071000000007 取模。

    💡 解决思路:动态规划

    我们可以用**动态规划(DP)**来统计合法的金字塔方案数。

    🧱 状态设计

    定义 DP 状态: dp[i][j]dp[i][j] 表示考虑完金字塔的ii(从下往上),并且ii 层使用的石块总数为 jj 时的方案总数。

    状态说明

    • ii 的范围是 11hh
    • jj 的范围是 00nn,因为使用的石块总数不能超过 nn
    • 我们最终要统计的是 dp[h][n]dp[h][n],即考虑完所有 hh 层,并且恰好使用了 nn 个石块的方案数。

    📐 状态转移

    假设我们当前处于状态 dp[i][j]dp[i][j],即第 ii 层使用了 jj 个石块。我们需要枚举i+1i+1使用的石块数量 kk,并将 dp[i][j]dp[i][j] 的值累加到 dp[i+1][j+k]dp[i+1][j+k] 中。

    但是,并非所有 kk 都是合法的,需要满足以下条件:

    1. 连通性:第 i+1i+1 层必须是一个连通块。
    2. 支撑关系:第 i+1i+1 层的每个石块,都必须由第 ii 层的石块支撑。由于金字塔的对称性要求,这通常意味着第 i+1i+1 层不能比第 ii 层"大"得太多。具体来说,如果第 ii 层的最大长度为 lil_i,第 i+1i+1 层的最大长度为 li+1l_{i+1},那么 li+1lil_{i+1} \leq l_i(题目已给出保证非严格递减)。
    3. 对称性:每一层都是中心对称的,因此我们只需要考虑其四分之一象限(例如,第一象限)的结构,然后通过对称性还原整个层。这样可以大大减少状态数。
    4. 石块数限制:显然,j+knj + k \leq n

    关键点:由于每一层都是对称的,且最大长度和宽度是偶数,我们可以用一个 li/2×li/2l_i/2 \times l_i/2 的矩阵来表示该层结构的四分之一。层的连通性和与下层的支撑关系,可以通过这个矩阵来定义和检查。转移时,实际上是在枚举上一层(第 ii 层)的四分之一结构下,当前层(第 i+1i+1 层)的四分之一结构可能的所有连通且满足支撑关系的形态,并计算该形态对应的石块总数 kk(记得乘以4,再减去对称轴上重复计算的部分,得到整个层的石块数)。

    🧩 初始状态与最终答案

    • 初始状态dp[0][0]=1dp[0][0] = 1,表示还没有放置任何石块时,方案数为1。
    • 最终答案dp[h][n]dp[h][n],即所有层都放置完毕,恰好使用 nn 个石块的方案总数,并对 10000000071000000007 取模。

    🧮 复杂度分析

    状态数有 O(hn)O(h \cdot n) 个,对于每个状态,我们需要枚举下一层的石块数 kk 以及下一层在四分之一象限内的具体形状。由于 l20l \leq 20h10h \leq 10n1000n \leq 1000,通过合理的状态压缩(如轮廓线DP)和优化,该方法是可行的。

    ⚠️ 实现细节提示

    1. 预处理:可以预处理出所有可能的单层形状(四分之一象限内),并记录其石块数、连通性以及它们之间的转移关系(支撑关系)。这步预处理可以大大加速DP过程。
    2. 对称轴处理:在计算整个层的石块总数时,要小心对称轴上的石块不要重复计算。对于一个 l×ll \times l 的层(ll 为偶数),其石块总数可以通过四分之一象限的石块数 cntcnt 计算为:total=4×cnt2×(l/2)+1total = 4 \times cnt - 2 \times (l/2) + 1?不对,需要仔细考虑。实际上,如果四分之一象限(不包括对称轴)有 aa 个石块,那么整个层包括两条对称轴,石块总数为 4a2(l/2)+14a - 2*(l/2) + 1?更稳妥的方法是直接模拟整个层的对称填充,或者直接使用预处理好的总石块数。
    3. 模块化:将问题分解为"生成所有合法的单层四分之一结构"和"计算层与层之间的转移方案数"两个模块,会使代码更清晰。

    💎 总结

    这道题是一个比较复杂的计数DP问题,结合了**对称性、连通性、拓扑约束(支撑关系)**等多个条件。其核心在于利用对称性减少状态表示规模,并通过动态规划枚举所有可能的合法结构。

    • 1

    信息

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