1 条题解

  • 0
    @ 2025-5-12 8:29:13

    题意分析

    题目要求用2×12 \times 1的多米诺骨牌铺满一个3×n3 \times n的矩形,计算不同的铺法数量。这是一个典型的动态规划问题,关键在于找出递推关系。

    解题思路

    1. 状态定义

      • 定义f(n)f(n)为铺满3×n3 \times n矩形的不同铺法数量。
    2. 初始条件

      • f(0)=1f(0) = 1:当n=0n = 0时,只有一种铺法(不放置任何骨牌)。
      • f(2)=3f(2) = 3:当n=2n = 2时,有三种基本铺法(全部竖放、上方横放两个下方竖放一个、下方横放两个上方竖放一个)。
    3. 递推关系

      • 对于n4n \geq 4nn为偶数,递推公式为f(n)=4×f(n2)f(n4)f(n) = 4 \times f(n - 2) - f(n - 4)
      • 推导基于铺法结构分析:每个3×n3 \times n的铺法可由3×(n2)3 \times (n - 2)的铺法扩展,但需排除重复计数的情况。
    4. 递推过程

      • 由于骨牌是2×12 \times 1的,仅当nn为偶数时可铺满,因此递推仅处理偶数。

    代码解释

    #include <iostream>
    #include <cstring>
    using namespace std;
    int f[31];
    
    int main()
    {
        memset(f, 0, sizeof(f));
        f[0] = 1;  // 初始条件:n=0时有一种铺法
        f[2] = 3;  // 初始条件:n=2时三种铺法
        
        // 递推计算偶数n的铺法数
        for (int i = 4; i <= 30; i += 2) {
            f[i] = 4 * f[i - 2] - f[i - 4];  // 应用递推公式
        }
    
        int n;
        while (cin >> n && n != -1) {
            cout << f[n] << endl;  // 直接输出预处理结果
        }
        return 0;
    }
    

    注意事项

    1. 输入处理

      • 输入包含多个测试用例,以1-1结束,直接查询预处理数组ff得到结果。
    2. 递推公式

      • f(n)=4×f(n2)f(n4)f(n) = 4 \times f(n - 2) - f(n - 4)是核心,通过分析铺法的扩展方式和去重推导得出。
    3. 边界条件

      • n=0n=0是递推的基础,保证公式对n2n \geq 2的偶数有效。
      • 题目输入保证nn为非负整数,无需处理奇数(奇数时无法铺满,结果为0,但题目未给出此类输入)。

    复杂度分析

    • 时间复杂度:预处理时间O(15)O(15)(仅计算n=0,2,4,,30n=0, 2, 4, \dots, 30共16个值),每次查询O(1)O(1)
    • 空间复杂度O(31)O(31),存储递推结果的数组空间。

    该算法通过预处理所有可能的nn值,实现了高效的常数时间查询,完全满足题目数据范围(n30n \leq 30)的要求。

    • 1

    信息

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