首页 > 其他分享 >骨牌铺方格二

骨牌铺方格二

时间:2024-09-17 20:22:46浏览次数:3  
标签:网格 long times 方格 骨牌 铺法 dp

描述

有一个大小是 2 x n 的网格,现在需要用 2 种规格的骨牌铺满,骨牌规格分别是 2 x 1 和 2 x 2,请计算一共有多少种铺设的方法。

输入

输入的第一行包含一个正整数 T(T <= 20),表示一共有 T 组数据。

接着是 T 行数据,每行包含一个正整数 N (N <= 30),表示网格的大小是 2 行 N 列。

输出

对于每组测试数据,请输出铺放方案的总数,每组数据输出一行。

输入样例 1 

3
2
8
12

输出样例 1

3
171
2731

这个问题可以通过动态规划来解决。我们需要计算在 \(2 \times n\) 的网格中用 \(2 \times 1\) 和 \(2 \times 2\) 的骨牌铺满的方案总数。

### 分析

1. **Base Cases**:
   - 当 \(n = 1\) 时,只有一种铺法:竖着放一个 \(2 \times 1\) 的骨牌。
   - 当 \(n = 2\) 时,有三种铺法:两个骨牌都竖着放,或者两个骨牌都横着放,或者放一个 \(2 \times 2\) 的骨牌。

2. **Recursive Relation**:
   - 对于 \(n \geq 3\),我们可以考虑最后一块骨牌的放法:
     - 如果最后一块骨牌是竖着放的,那么剩下的部分是 \(2 \times (n-1)\) 的网格。
     - 如果最后两块骨牌是横着放的,那么剩下的部分是 \(2 \times (n-2)\) 的网格。
     - 如果最后一块骨牌是 \(2 \times 2\) 的骨牌,那么剩下的部分也是 \(2 \times (n-2)\) 的网格。
   - 因此,递推关系为:\(dp[n] = dp[n-1] + 2 \times dp[n-2]\)。

### 代码实现

```c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

long long dp(int n) {
    if (n == 1) return 1;
    if (n == 2) return 3;

    long long dp[31];
    dp[1] = 1;
    dp[2] = 3;

    for (int i = 3; i <= n; i++) {
        dp[i] = dp[i - 1] + 2 * dp[i - 2];
    }

    return dp[n];
}

int main() {
    int T;
    scanf("%d", &T);

    while (T--) {
        int n;
        scanf("%d", &n);
        long long result = dp(n);
        printf("%lld\n", result);
    }

    return 0;
}
```

### 解释

1. **Base Cases**:
   - `dp[1] = 1`:只有一种铺法。
   - `dp[2] = 3`:有三种铺法。

2. **Dynamic Programming Array**:
   - `dp[i]` 表示 \(2 \times i\) 的网格的铺法总数。
   - 递推关系:`dp[i] = dp[i-1] + 2 * dp[i-2]`。

3. **Main Function**:
   - 读取输入的整数 `T`,表示测试数据的组数。
   - 对于每组测试数据,读取整数 `n`。
   - 调用 `dp` 函数计算铺法总数。
   - 输出结果。

### 示例

对于输入:
```
3
2
8
12
```

输出将是:
```
3
171
2731
```

### 总结

- 这个问题可以通过动态规划来解决,递推关系为 `dp[n] = dp[n-1] + 2 * dp[n-2]`。
- 代码实现中,我们使用了一个数组来存储中间结果,以避免重复计算。
- 最终输出每组测试数据的铺法总数。

标签:网格,long,times,方格,骨牌,铺法,dp
From: https://blog.csdn.net/yishiduoshhaojie/article/details/142318339

相关文章

  • K取方格数(最大费用流)
    题目描述给定\(n\timesm\)的方格\(a[1..n][1..m]\),每个格子有一个数。从\((1,1)\)出发走到\((n,m)\)一共不超过\(K\)次,只能往右往下走,走过的位置的数会变成\(0\)。问经过的位置的数字之和的最大值是多少。输入第一行包含一个正整数\(T(1\leqT\leq10)\),表示测试数据的组数......
  • cf966:E. Photoshoot for Gorillas(一个格子被多少个方格包裹了)
    题目你非常喜欢大猩猩,于是决定为它们组织一次拍摄活动。大猩猩生活在丛林中,丛林被表示为一个有......
  • 线性DP-方格取数与传纸条
    方格取数题目链接:方格取数题解:一种容易想到的思路是:采用贪心法对第一次和第二次行走分别做DP,将两次DP的最优解累加即为答案。但是这种贪心是错误的,因为两次DP均为对局部求最优解(第二次DP是在第一次DP的影响下求出的局部最优解),这两次DP的结果之和不为全局最优解(不满足无后效性),例......
  • 51nod-3983走方格
    https://class.51nod.com/Html/Textbook/Problem.html#problemId=3983&textbookChapterId=724https://class.51nod.com/Html/Textbook/ChapterIndex.html#textbookId=126&chapterId=337移动与时间段有关,如果按照时间段划分状态那么每一段内只有一条线性的转移。需要一行一行或......
  • 闲话 718:1x2 骨牌的矩形覆盖计数
    注:以下的\(i\)不在下标时均代表虚数单位,\([n]=\{1,2,...,n\}\)。首先把格子当成点,连一个图出来:上下格子连向上的边,左右格子交替连向左/向右的边。这样求完美匹配方案数即可。这样假设搞出来的邻接矩阵是\(S\)。那么\(ans=Pf(S)=\sqrt{\detS}\)。通过对行的缩放操作(即初等变......
  • uniapp [全端兼容] - 详细实现用户电子签名 “逐字校验“ 将姓名按字拆开分别手写签署
    前言如果您需要“合同专用”签字板及展示,请访问这篇文章。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解完成用户进行电子签名时,将其姓名进行拆分为独立的汉字,并由系统自动生成渲染对应的单个汉字文字的签名和验证笔画......
  • 美丽方格
    题目描述你手里拿着很多字母牌,在一个方格棋盘上下棋,棋盘的中心是坐标(0,0),你把字母牌在棋盘上摆放,你规定一个美丽的方格是指中心也是坐标(0,0),且方格中不存在相同字母的牌,给你一个摆放完的棋盘,问是美丽方格中最多多少张牌?思路这题第一反应是枚举正方形边长,为了方便,枚举的数是......
  • 7-3 sdut-C语言实验-骨牌铺方格
    7-3sdut-C语言实验-骨牌铺方格分数20全屏浏览切换布局作者 马新娟单位 山东理工大学斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,很多题目由此衍生而来,骨牌铺方格便是......
  • PC方格音乐v1.5.4无损音乐播放 – 一款免费无损音乐播放器
    软件介绍方格音乐(魔音Morin电脑版)是一款免费无损音乐播放器及付费歌曲无损音乐免费下载软件.方格音乐播放器采用简洁的风格设计,可以免费在线试听及下载付费歌曲,版权音乐,无损音质歌曲.方格音乐电脑版免费听歌神器支持歌曲解析功能,第三方歌单导入,歌词频谱功能,下载音乐时......
  • [数字三角形]方格取数
    设有N×N的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走了两次,试找出......