黄油运输的迷思

当智加科技的无人驾驶车队首次进行横跨美洲的生鲜运输时,工程师阳阳注视着一桶桶的黄油陷入了沉思。他突发奇想,要这一切都是标准化包装物件,那么其尺寸不仅节约控件、提升干线物流运输效率,同时也让简化车辆的动力学、运动学建模,帮助自动驾驶算法更精准、灵敏地操控车辆(但愿如此)。
如果现有两种包装物品的包装运输箱,尺寸分别是长宽 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 
#include 
#include 

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;
}

你可能感兴趣的:(算法,动态规划,算法)