【洛谷 P1990】覆盖墙壁 题解(动态规划)

覆盖墙壁

题目描述

你有一个长为 N N N 宽为 2 2 2 的墙壁,给你两种砖头:一个长 2 2 2 宽 1 1 1,另一个是 L 型覆盖 3 3 3 个单元的砖头。如下图:

0  0
0  00

砖头可以旋转,两种砖头可以无限制提供。你的任务是计算用这两种来覆盖 N × 2 N\times 2 N×2 的墙壁的覆盖方法。例如一个 2 × 3 2\times3 2×3 的墙可以有 5 5 5 种覆盖方法,如下:

012 002 011 001 011  
012 112 022 011 001

注意可以使用两种砖头混合起来覆盖,如 2 × 4 2\times4 2×4 的墙可以这样覆盖:

0112
0012

给定 N N N,要求计算 2 × N 2\times N 2×N 的墙壁的覆盖方法。由于结果很大,所以只要求输出最后 4 4 4 位。例如 2 × 13 2\times 13 2×13 的覆盖方法为 13465 13465 13465,只需输出 3465 3465 3465 即可。如果答案少于 4 4 4 位,就直接输出就可以,不用加前导 0 0 0,如 N = 3 N=3 N=3 时输出 5 5 5。

输入格式

一个整数 N N N,表示墙壁的长。

输出格式

输出覆盖方法的最后 4 4 4 位,如果不足 4 4 4 位就输出整个答案。

样例 #1

样例输入 #1

13

样例输出 #1

3465

提示

数据保证, 1 ≤ N ≤ 1000000 1\leq N\leq 1000000 1≤N≤1000000。


思路

f[i] 表示铺满前 i 列的方法数。

g[N] 表示铺满前 i 列,第 i+1 列只铺一格的方法数。

作图法求状态转移方程。

对于f[x]

f[i - 1]

f[i - 2]

g[i - 3]

有两种情况。

对于g[x]

以 g[i - 3] 为例。

f[i - 3]

g[i - 3]

cpp 复制代码
g[i - 2] = f[i - 3] + g[i - 3];

化简得

cpp 复制代码
g[i] = f[i - 1] + g[i - 1];

状态转移方程:

cpp 复制代码
f[i] = f[i - 1] + f[i - 2] + 2 * g[i - 2];
g[i] = f[i - 1] + g[i - 1];

用列举法不难得到初始情况下f[1]、f[2]、g[1]和g[2]的值。

使用 %10000 来保证结果只包含最后4位。

注意:每次计算动态转移方程后需要立即取模,否则WA。


AC代码

cpp 复制代码
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;

const int N = 1e7 + 5;
const int M = 10000;

// 铺满前i列
int f[N];
// 铺满前i列,第i+1列只铺一格
int g[N];

int main()
{
    int n;
    cin >> n;
    f[1] = 1;
    f[2] = 2;
    g[1] = 1;
    g[2] = 2;
    for (int i = 3; i <= n; i++)
    {
        f[i] = (f[i - 1] + f[i - 2] + 2 * g[i - 2]) % M;
        g[i] = (f[i - 1] + g[i - 1]) % M;
    }
    cout << f[n] % M << endl;
    return 0;
}
相关推荐
Amor风信子4 分钟前
华为OD机试真题---跳房子II
java·数据结构·算法
Mr.Z.41114 分钟前
【历年CSP-S复赛第一题】暴力解法与正解合集(2019-2022)
c++
Death20018 分钟前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip
戊子仲秋21 分钟前
【LeetCode】每日一题 2024_10_2 准时到达的列车最小时速(二分答案)
算法·leetcode·职场和发展
邓校长的编程课堂23 分钟前
助力信息学奥赛-VisuAlgo:提升编程与算法学习的可视化工具
学习·算法
郭二哈29 分钟前
C++——list
开发语言·c++·list
sp_fyf_202439 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-03
人工智能·算法·机器学习·计算机视觉·语言模型·自然语言处理
Eric.Lee20211 小时前
数据集-目标检测系列- 螃蟹 检测数据集 crab >> DataBall
python·深度学习·算法·目标检测·计算机视觉·数据集·螃蟹检测
黑不溜秋的1 小时前
C++ 语言特性29 - 协程介绍
开发语言·c++
一丝晨光1 小时前
C++、Ruby和JavaScript
java·开发语言·javascript·c++·python·c·ruby