第十三届蓝桥杯 C++ B 组省赛 G 题———积木画(AC)
创始人
2024-04-13 07:42:51
0

目录

  • 1.积木画
    • 1.题目描述
    • 2.输入格式
    • 3.输出格式
    • 4.样例输入
    • 5.样例输出
    • 6.样例说明
    • 7.数据范围
    • 8.原题链接
  • 2.解题思路
  • AC_code

1.积木画

1.题目描述

小明最近迷上了积木画, 有这么两种类型的积木, 分别为 III 型(大小为 2 个单位面积) 和 LLL 型 (大小为 3 个单位面积):
在这里插入图片描述
同时, 小明有一块面积大小为 2×N2 \times N2×N 的画布, 画布由 2×N2 \times N2×N 个 1×11 \times 11×1 区域构 成。小明需要用以上两种积木将画布拼满, 他想知道总共有多少种不同的方式? 积木可以任意旋转, 且画布的方向固定。

2.输入格式

输入一个整数 NNN,表示画布大小。

3.输出格式

输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007 取模后的值。

4.样例输入

3

5.样例输出

5

6.样例说明

五种情况如下图所示,颜色只是为了标识不同的积木:

在这里插入图片描述

7.数据范围

1≤N≤1071≤N≤10^71≤N≤107

8.原题链接

积木画

2.解题思路

比较简单的状态压缩 dpdpdp 的模型,虽然 NNN 很大,但总共只有两行,所以只需要考虑结尾的插入情况即可。
定义 f[i][j]f[i][j]f[i][j] 为已经排好了前 i−1i-1i−1 列,且第 iii 列的状态为 jjj 的方案数。当 jjj 为 0 时表示第 iii 列上面和下面均未摆放积。为 1 时表示上面未摆,下面摆放了积木。当为 2 时表示上面摆了,下面未摆的情况,当为 3 时表示上下均摆好了积木的情况。
从定义可知最终答案为 f[n][3]f[n][3]f[n][3]

考虑如何进行初始化,当 nnn 为0时,可以视为完全摆好的情况,则f[0][3]=1f[0][3]=1f[0][3]=1,当 nnn 为 1 时,只有一种摆法,则f[1][3]=1f[1][3]=1f[1][3]=1。

接下来考虑如何进行状态转移:
首先考虑 f[i][0]f[i][0]f[i][0] ,因为0表示上下都未摆放积木,而状态定义就要求了前 i−1i-1i−1列已经摆好,则转移方程:
f[i][0]=f[i−1][3]f[i][0]=f[i-1][3]f[i][0]=f[i−1][3]
在这里插入图片描述

然后考虑f[i−1][1]f[i-1][1]f[i−1][1]如何转移:

1表示我们第 iii 列是下面摆放了上面未摆放,也就是下面突出了一格,我们考虑如何才会产生这样的效果:

当这样摆放时可以得到,但转移时不应该从 i−1i-1i−1 列转移,而应该是从f[i−2][3]f[i-2][3]f[i−2][3] 转移。
在这里插入图片描述
除此之外我们还可以像下面这样插入,这样我们可以从f[i−1][2]f[i-1][2]f[i−1][2]转移过来。
在这里插入图片描述
综上我们有两种情况可以得到f[i][1]f[i][1]f[i][1],转移方程为:
f[i][1]=(f[i−1][0]+f[i−1][2])f[i][1] = (f[i - 1][0] + f[i - 1][2])f[i][1]=(f[i−1][0]+f[i−1][2])

分析f[i][2]f[i][2]f[i][2]其实和f[i][1]f[i][1]f[i][1]同理,反过来就行,有如下两种插入情况:
在这里插入图片描述
在这里插入图片描述
那么转移方程则为:
f[i][2]=(f[i−1][0]+f[i−1][1])f[i][2] = (f[i - 1][0] + f[i - 1][1])f[i][2]=(f[i−1][0]+f[i−1][1])

最后考虑f[i][3]f[i][3]f[i][3]如何转移,这个转移的情况比较多,直接上图大家就能看懂了:
在这里插入图片描述
横着插两块,从f[i−2][3]f[i-2][3]f[i−2][3]转移
在这里插入图片描述
可以从f[i−1][3]f[i-1][3]f[i−1][3]转移
在这里插入图片描述
在这里插入图片描述
可以从f[i−1][1]f[i-1][1]f[i−1][1]和f[i−1][2]f[i-1][2]f[i−1][2]转移,综上:
f[i][3]=(f[i−2][3]+f[i−1][3]+f[i−1][2]+f[i−1][1])f[i][3] = (f[i - 2][3] + f[i - 1][3] + f[i - 1][2] + f[i - 1][1])f[i][3]=(f[i−2][3]+f[i−1][3]+f[i−1][2]+f[i−1][1])

AC_code

#include
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 10000010;int n;
// f[i][j]表示已经操作完前i-1列,且第i列的状态为j的方案数
LL f[N][3];
void solve()
{cin >> n;f[0][3] = 1;f[1][3] = 1;for (int i = 2; i <= n; ++i) {f[i][0] = f[i - 1][3];f[i][1] = (f[i - 1][0] + f[i - 1][2]) % mod;f[i][2] = (f[i - 1][0] + f[i - 1][1]) % mod;f[i][3] = (f[i - 2][3] + f[i - 1][3] + f[i - 1][2] + f[i - 1][1]) % mod;}cout << f[n][3] << '\n';
}
int main()
{ios_base :: sync_with_stdio(false);cin.tie(nullptr);int t = 1;while (t--){solve();}return 0;
}

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...