当智加科技的无人驾驶车队首次进行横跨美洲的生鲜运输时,工程师阳阳注视着一桶桶的黄油陷入了沉思。他突发奇想,要这一切都是标准化包装物件,那么其尺寸不仅节约控件、提升干线物流运输效率,同时也让简化车辆的动力学、运动学建模,帮助自动驾驶算法更精准、灵敏地操控车辆(但愿如此)。
如果现有两种包装物品的包装运输箱,尺寸分别是长宽 1米×1米 和 1米×2米
【本题编程】假定用这两种箱子排成一个 1米×n米 的队列,不限两种箱子的使用数量,则有多少种不同的排列方式?
输入描述:
第一行输入为整数 n (1<=n<=100)
输出描述:
第一行输出为结果整数
示例1
输入 5
输出 8
解题思路:dp+大数加法。
对于长度为 i 米的队列,我们可以考虑最后一个箱子的长度。如果最后一个箱子的长度为 1 米,那么前面的 i-1 米长度的队列可以有 dp[i-1] 种不同的排列方式。如果最后一个箱子的长度为 2 米,那么前面的 i-2 米长度的队列可以有 dp[i-2] 种不同的排列方式。
因此,我们可以得到状态转移方程:
dp[i] = dp[i-1] + dp[i-2]
#include <iostream>
#include <string>
#include <vector>
std::string add(const std::string& num1, const std::string& num2) {
std::string result;
int carry = 0; // 进位值
int i = num1.size() - 1; // num1的最后一位索引
int j = num2.size() - 1; // num2的最后一位索引
// 从最低位开始逐位相加
while (i >= 0 || j >= 0 || carry > 0) {
int digit1 = (i >= 0) ? (num1[i] - '0') : 0; // 获取num1的当前位数字
int digit2 = (j >= 0) ? (num2[j] - '0') : 0; // 获取num2的当前位数字
int sum = digit1 + digit2 + carry; // 当前位的和,加上进位
carry = sum / 10; // 计算新的进位值
int digit = sum % 10; // 当前位的数字
result = std::to_string(digit) + result; // 将当前位数字转为字符并添加到结果字符串的最前面
i--; // 移动到num1的下一位
j--; // 移动到num2的下一位
}
return result;
}
std::string exam(int n) {
std::vector<std::string> dp;
dp.push_back("0"); // 初始化dp[0]为0 注意一定要加上不然会越界!!
dp.push_back("1"); // 初始化dp[1]为1
dp.push_back("2"); // 初始化dp[2]为2
for (int i = 3; i <= n; i++) {
dp.push_back(add(dp[i - 1], dp[i - 2])); // 计算dp[i],通过dp[i-1]和dp[i-2]相加
}
return dp[n]; // 返回长度为n米的队列的不同排列方式数量
}
int main() {
int n;
std::cin >> n; // 输入n
std::string result = exam(n); // 调用exam函数计算结果
std::cout << result << std::endl; // 输出结果
return 0;
}