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

候。

相关推荐
徐小夕31 分钟前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao39 分钟前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄1 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘562 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
careathers3 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
y1su4 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan4 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
其实防守也摸鱼5 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机5 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1005 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构