华为机考题:最小代价爬楼梯

题目描述

给你一个整数数组 cost,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个 或两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部(即越过最后一个台阶)的最低花费。

输入描述

一行,包含若干整数(用空格分隔),表示 cost 数组,长度范围为 2 <= cost.length <= 1000,每个元素 0 <= cost[i] <= 999。

输出描述

一个整数,表示达到楼梯顶部的最低花费。

示例

输入:

text

复制代码
10 15 20

输出:

text

复制代码
15

说明: 从下标 1 的台阶开始(花费 15),向上爬两个台阶到达顶部,总花费 15。


输入:

text

复制代码
1 100 1 1 1 100 1 1 100 1

输出:

text

复制代码
6

说明: 从下标 0 开始,依次走 0→2→3→4→6→7→9→顶部,花费 1+1+1+1+1+1 = 6。


输入:

text

复制代码
0 0 1 0

输出:

text

复制代码
0

C++ 解决方法(动态规划)

思路: 设 dp[i] 表示到达第 i 个台阶所需的最小花费。

  • 起始状态:可以从第 0 或第 1 个台阶开始,所以 dp[0] = 0,dp[1] = 0(到达这两个台阶本身不花钱,只有从它们"往上爬"才花钱)。

  • 状态转移:到达第 i 个台阶,可以从第 i-1 个台阶爬上来(支付 cost[i-1]),也可以从第 i-2 个台阶爬上来(支付 cost[i-2]):

    text

    复制代码
    dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
  • 最终答案是 dp[n],其中 n = cost.size(),表示越过最后一个台阶到达顶部。

由于 dp[i] 只依赖前两项,可以用滚动变量 把空间优化到 O(1)。

时间复杂度 O(n),空间复杂度 O(1)。

cpp 复制代码
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();

        // dp[i] 表示到达第 i 个台阶的最小花费
        // 用滚动变量优化空间
        int prev2 = 0; // dp[0]
        int prev1 = 0; // dp[1]

        for (int i = 2; i <= n; i++) {
            int cur = min(prev1 + cost[i - 1], prev2 + cost[i - 2]);
            prev2 = prev1;
            prev1 = cur;
        }

        return prev1; // dp[n],即到达顶部的最小花费
    }
};

int main() {
    string line;
    getline(cin, line);

    vector<int> cost;
    istringstream iss(line);
    int x;
    while (iss >> x) {
        cost.push_back(x);
    }

    Solution sol;
    cout << sol.minCostClimbingStairs(cost) << endl;

    return 0;
}
相关推荐
可涵不会debug4 小时前
C++ std::bind 实战教程:线程池、回调场景全覆盖
linux·开发语言·c++
垆边人似月.5 小时前
华为机考题:二叉树的最大路径和
c语言·c++
程序猿编码5 小时前
不用 PyTorch!纯 C 实现 N 维张量 + 反向传播,完成手写数字识别训练
c语言·人工智能·pytorch·神经网络·卷积神经网络·大模型推理
2601_962218615 小时前
深入理解C++中的thread_local线程局部变量的应用
开发语言·c++
无名猿5 小时前
C++ lambda 捕获列表详解:值捕获、引用捕获、初始化捕获与悬垂引用
c++·现代c++·语法基础·踩坑记录
lengxuenong6 小时前
枚举例题分析
c++·算法·青少年编程
繁华的地方不一定留下你的脚印6 小时前
C++线程如何安全停止与唤醒:std::jthread、stop_token与condition_variable
开发语言·c++
Navigator_Z6 小时前
LeetCode //C - 1269. Number of Ways to Stay in the Same Place After Some Steps
c语言·算法·leetcode
沫璃染墨7 小时前
《从零入门Linux系统篇(五十一):线程篇·四——pthread线程库详解:从线程创建到终止与分离》
linux·运维·服务器·开发语言·c++·系统架构·线程