小鹿家有一面宽 2 长 n 的墙面,现在需要用一种规格的瓷砖铺满,瓷砖规格是 2×1(宽2长1),请计算一共有多少种铺设的方法。 无标题.png 输入描述 一个正整数 n,表示墙面宽为 2 长为 n。 输出描述 输出一共有多少种铺设的方法。 样例输入 1
时间: 2024-11-18 11:16:17 浏览: 9
这是一个经典的动态规划问题,可以通过构建状态转移方程来求解。我们可以定义一个数组 `dp`,其中 `dp[i]` 表示使用 2x1 瓷砖铺满宽度为 2、长度为 i 的墙面的方式数量。对于每个长度 i(从 0 到 n),有两种情况:
1. 如果最后一块瓷砖放到了最右边,那么墙的剩余长度就是 i - 1,因此 `dp[i] = dp[i - 1]`。
2. 如果最后一块瓷砖没有放到最右边,那么最后一块必须放在左边,所以前两块可以任意放置,即 `dp[i] = dp[i - 2] + dp[i - 1]`,因为前一块有放或不放两种选择。
初始条件是 `dp[0] = 1`,因为有一个空的墙面可以用一种方式铺满(不放瓷砖)。
这里是一个简单的 C++ 代码实现:
```cpp
#include <iostream>
int countWays(int n) {
if (n == 0) return 1; // 基本情况,空墙只有一种方式
int dp[n + 1]; // 初始化动态规划数组
dp[0] = 1;
dp[1] = 1; // 第二个位置也可以不放瓷砖
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1]; // 最后一块放最右边
dp[i] += dp[i - 2]; // 最后一块不放最右边
}
return dp[n];
}
int main() {
int n;
std::cout << "请输入墙面的长度 n: ";
std::cin >> n;
std::cout << "一共有 " << countWays(n) << " 种铺设方法。\n";
return 0;
}
```
阅读全文