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

题目描述

给你一个整数数组 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;
}
相关推荐
敲上瘾1 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
旖旎夜光3 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
希和20274 小时前
C语言程序设计题|有序数组插入数字冒泡排序
c语言·数据结构·算法
旖旎夜光4 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
apcipot_rain14 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60514 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67814 小时前
深挖C++:类和对象(中)
开发语言·c++
D e re k ZH17 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
xiaoye-duck18 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai100719 小时前
【Effective Modern C++】学习第一章
c++