算法日常・每日刷题--<动态规划>3

746. 使用最小花费爬楼梯 - 力扣(LeetCode)

题目描述

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

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。

注意:楼梯顶部不是 cost 数组里的台阶,是数组末尾之后的位置。例如 cost 长度为 n,要走到 n 的位置才算登顶。

示例: 输入:cost = [10,15,20] 输出:15 解释:从下标 1 开始,付 15,直接跨两步到达楼顶。

动态规划五部曲分析

做动态规划题目,固定 5 步思考:dp 数组含义、递推公式、初始化、遍历顺序、结果返回。

1. dp 数组定义

dp[i]:到达第 i 阶台阶,所需要的最小花费。

i 的范围:0 ~ n,n = cost.size(),dp[n]代表到达楼顶。

2. 状态转移公式

想要到达第i位置,只有两种来源:

  1. 从i‑1台阶爬上来:到达i‑1的花费dp[i‑1] + 登上i‑1台阶要付的钱cost[i‑1]
  2. 从i‑2台阶爬上来:到达i‑2的花费dp[i‑2] + 登上i‑2台阶要付的钱cost[i‑2]

取得两者的最小值即可

3. dp 数组初始化

题目允许起点选 0 或者 1 台阶,站在 0、1 台阶本身不需要花钱,花钱是离开这个台阶往上走的时

4. 遍历顺序

每一个dp[i]依赖前面dp[i‑1]、dp[i‑2],所以从左到右循环,i 从 2 一直到 n。

5. 返回结果

楼顶是第 n 位置,返回dp[n]。

cpp 复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        // 定义dp数组,dp推到公式,初始化,从左往右填,返回值
        int n=cost.size();
        vector<int>dp(n+1);
        dp[0]=0;
        dp[1]=0;
        for(int i=2;i<n+1;i++)
        {
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[n];
    }
};

候。

相关推荐
H.莓飛2 小时前
【数据结构】队列_OJ题
linux·数据结构·centos
-dzk-2 小时前
【堆】LC 347.前 K 个高频元素
算法·堆
H.莓飛2 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia6262 小时前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
和裕2 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i2 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
淡海水3 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
平行侠3 小时前
065 B树(B-Tree)
数据结构·b树·树查找
无忧.芙桃4 小时前
C++语言原理与实践(十):vector类的底层实现
开发语言·c++·算法