算法日常・每日刷题--<动态规划>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];
    }
};

候。

相关推荐
2601_967979122 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔2 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
通信小呆呆2 小时前
电子战干扰技术:从“蛮力压制”到“精准欺骗”,再到“认知博弈”
算法·通信·isac
老师我太想进步了20263 小时前
【数据结构-6】算法美学之单链表(1)
数据结构·算法
希望我万事顺遂3 小时前
力扣hot100-滑动窗口最大值
数据结构·算法·leetcode
꧁细听勿语情꧂4 小时前
二叉树余题,排序、直接插入排序、希尔排序
c语言·开发语言·数据结构·算法
是main不是漫4 小时前
【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱
数据结构·算法·leetcode
专注仿真14 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
罗西的思考15 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
好悬给我拽开线19 小时前
ZILOT 论文解析
算法