DP学习第一篇之爬楼梯

news2025/3/16 6:12:42

DP学习之爬楼梯

剑指 Offer II 088. 爬楼梯的最少成本 - 力扣(LeetCode)
在这里插入图片描述

1. 题目分析

在这里插入图片描述
可以从第0或者第1作为起始台阶、每次可以选择跳1或2步、到楼顶结束

2. 解题

a.解法一

  1. 状态表示

    tips: 经验+题目要求。以i位置为结尾,。。。
dp[i] : 到达i位置时,最小花费

  1. 状态转移方程

    tips: 用之前或之后的状态,推导出dp[i]的值。根据最近的一步,来划分问题

到达i位置之前:

  • 从i-1位置走一步,支付cost[i-1]的花费,到i位置
  • 从i-2位置走两步, 支付cost[i-2]的花费,到i位置

由于状态表示以及定义,需要选择到达i位置的最小花费

即:dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])

  1. 初始化

    tips: 保证填表的时候不越界。i为0时,需要dp[-1]和dp[-2]会越界

题目要求:可以从0或者1下标作为初始台阶

dp[0] = dp[1] = 0

  1. 填表顺序

由前面的dp[i - 1],dp[i - 2]值可以推导dp[i]

从左往右(---->)

  1. 返回值

楼顶在n下标处

return dp[n]


代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {

        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回值
        int n = cost.size();
        vector<int> dp(n + 1, 0);
        for(int i = 2; i <= n; ++i)
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);

        return dp[n];
    }   
};

b.解法二

  1. 状态表示

以i位置为起点,。。。
dp[i] : 从i位置出发,到达楼顶,此时的最小发费

  1. 状态转移方程

到达i位置之后:

  • 从i位置走一步,支付cost[i]的花费,到i+1位置
  • 从i位置走两步, 支付cost[i]的花费,到i+2位置

由于状态表示以及定义,需要从那个位置开始(i+1、i+2)到终点的花费最小

即:dp[i] = min(dp[i + 1], dp[i + 2]) + cost[i]

  1. 初始化

    tips: 保证填表的时候不越界。
从楼顶(n下标)到楼顶的花费为0
dp[n - 1] = cost[n - 1], dp[n - 2] = cost[n - 2]

  1. 填表顺序

由前面的dp[i + 1],dp[i + 2]值可以推导dp[i]

从右往左(<----)

  1. 返回值

根据状态定义,题目要求
return min(dp[0], dp[1])


代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {

        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回值
        int n = cost.size();
        vector<int> dp(n, 0);
        dp[n - 1] = cost[n - 1], dp[n - 2] = cost[n - 2];
        for(int i = n - 3; i >= 0; --i)
            dp[i] = min(dp[i + 1], dp[i + 2]) + cost[i];

        return min(dp[0], dp[1]);
    }    
};

3. 总结

首先根据题目要求和经验(一般经验:以某个位置为结尾或以某个位置为起点,。。。)推导出状态表示。

根据状态表示来推状态转移方程。如果定义的状态表示不能够推导出状态转移方程,则状态表示是错误的。

新手要敢于自己定义状态表示,孰能生巧,大量做题后,状态表示的定义往往会向着正确的方向。


    🦀🦀观看~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645858.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Frida技术:App逆向开发屠龙刀

Frida是一种基于JavaScript的动态分析工具,可以用于逆向开发、应用程序的安全测试、反欺诈技术等领域。Frida主要用于在已安装的应用程序上运行自己的JavaScript代码,从而进行动态分析、调试、修改等操作,能够绕过应用程序的安全措施,可以助力于对应用程序进行逆向分析。 …

OpenShift Virtualization - 从集群外部访问集群中的 VM(附视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.12 的环境中验证 文章目录 方法1&#xff1a;通过 Service 的 NodePort 访问 VM方法2&#xff1a;通过外部 IP 访问 VM确认 OpenShift 集群环境为 Worker 节点添加 Linux Bridge创建使用 Li…

大文件上传功能在标签服务的简单应用和代码实现

各位看官大家好&#xff0c;今天给大家分享的又是一篇实战文章&#xff0c;希望大家能够喜欢。 目前「袋鼠云客户数据洞察平台」标签服务的群组按种类划分&#xff0c;可以分为三大类&#xff0c;分别是实时群组、动态群组以及静态群组。如果按创建方式划分则有两种&#xff0…

6.11 有名管道和无名管道

目录 进程间通讯介绍 System V IPC 无名管道 无名管道特点 无名管道创建-pipe 无名管道通信 无名管道-示例 有名管道特点 有名管道创建-mkfifo 有名管道读写-示例 进程间通讯介绍 无名管道&#xff08;pipe&#xff09; 有名管道 &#xff08;fifo&#xff09; 信号…

制造业供应商合作该如何协调?SRM供应商管理系统的出现改变一切

制造业是使用SRM系统频率最高的行业了&#xff0c;因为该行业需要与大量供应商合作和协调&#xff0c;以便及时获得所需的原材料和零件。同时&#xff0c;该行业生产周期长&#xff0c;需求通常较为稳定&#xff0c;需要稳定的供应链管理来确保生产效率和质量。因此&#xff0c…

写一个vscode支持vue文件跳转到定义的插件,又可以愉快地摸鱼了

1. 背景 vscode自身是支持vue文件组件跳转到定义的&#xff0c;但是支持的力度是非常弱的。我们在vue-cli的配置的下&#xff0c;可以写很多灵活的用法&#xff0c;这样可以提升我们的生产效率。但是正是这些灵活的写法&#xff0c;导致了vscode自身提供的功能无法支持跳转到文…

MySQL数据库语言二:DML、DQL

&#x1f618;作者简介&#xff1a;正在努力的99年打工人。 &#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。 &#x1f64f;创作不易&#xff0c;动…

Linux---网络传输命令(ping、wget、curl)

1. ping命令 执行 ping 指令会使用 ICMP 传输协议&#xff0c;发出要求回应的信息&#xff0c;若远端主机的网络功能没有问题&#xff0c; 就会回应该信息&#xff0c;因而得知该主机运作正常。 语法&#xff1a;ping [参数] IP名或主机名 参数包括&#xff1a; 注意&#…

Jmeter实现Dubbo接口测试

目录 前言&#xff1a; 一、准备 二、编写我们的测试工程 三、Jmeter来测试这个工程 前言&#xff1a; JMeter可以用来测试Dubbo接口的性能和负载。Dubbo是阿里巴巴的高性能RPC框架&#xff0c;常用于分布式服务的调用。为了测试Dubbo接口&#xff0c;需要使用JMeter提供的…

Android Chrome Custom Tabs

参考文档 API文档 链接 Chrome Custom Tabs 参考文档 https://developer.chrome.com/docs/android/custom-tabs/ Chrome Custom Tabs最佳实践_customtabs_Just_Sanpark的博客-CSDN博客 Chrome Custom Tabs最佳实践_chrome custom tabs集成_wxx614817的博客-CSDN博客 Chrome…

红黑树(RBTree)c++实现

目录 红黑树介绍 红黑树的性质&#xff1a; 红黑树的结点类 搜索(红黑)树的旋转 旋转分为4种(左旋&#xff0c;右旋&#xff0c;左右双旋&#xff0c;右左双旋)&#xff1a; 左旋(RotateL) 右旋(RotateR) 左右双旋(RotateLR) 右左双旋(RotateRL) 红黑树的插入 插入结…

计算机中丢失MSVCP140.dll无法启动此程序怎么办,可以使用这个方法修复

计算机中丢失MSVCP140.dll会导致很多软件跟游戏无法启动运行&#xff0c;这个问题相信困扰着不少小伙伴&#xff0c;遇到这个问题其实不用慌&#xff0c;也无需重装系统。需要先了解清楚MSVCP140.dll文件是什么&#xff0c;已经在我们电脑系统中的作用&#xff0c;了解清楚以后…

【技术干货】数字电路电平标准

信号的逻辑电平经历了从单端信号到差分信号、从低速信号到高速信号的发展过程。最基本的单端信号逻辑电平为CMOS、TTL&#xff0c;在此基础上随着电压摆幅的降低&#xff0c;出现LVCMOS、LVTTL等逻辑电平&#xff0c;随着信号速率的提升又出现ECL、PECL、LVPECL、LVDS、CML等差…

2.7V至25V宽输入电压15A 峰值电流

HT7179是一款高功率异步升压转换器&#xff0c;集成 20mΩ功率开关管&#xff0c;为便携式系统提供高效的 小尺寸解决方案。 HT7179具有2.7V至25V宽输入电压范围&#xff0c;可为 采用单节或两节锂电池&#xff0c;或12V铅酸电池的应 用提供支持。该器件具备15A开关电流能力&a…

【Java基础学习打卡05】命令提示符

目录 引言一、命令提示符是什么二、命令提示符常用命令1.打开命令提示符2.命令演示3.常用命令 总结 引言 知道命令提示符是什么&#xff0c;熟练打开命令提示符&#xff0c;熟练使用常用命令&#xff0c;并自行尝试其他命令。本文只是对命令提示符进行简单介绍和使用。 一、命…

绝版功能回归,Win11开始向Win7进化了

如果将 Win11 上架到 Steam 提供评论打分&#xff0c;那么 Win11 会和很多有争议的游戏一样&#xff1a;褒贬不一。 许多功能是吸引人的&#xff0c;但微软总会在什么时候突然给你一击。 前有 VBS 影响性能、谜之卡顿&#xff0c;后有各种广告、自动安装微软电脑管家。 以及我…

运营活动类项目测试方案设计

1、背景 随着业务的不断发展成熟&#xff0c;商业业务逐渐向重运营、重策略的模式发展&#xff0c;提出的需求中运营活动类需求数量也不断增多。而通过项目的积累、与其他业务的讨论共创&#xff0c;我们也积累了一批对运营活动类项目的测试点和对应的测试方案。下面我将从设计…

List容器(Java)

文章目录 1.容器介绍1.1 容器接口结构1.2 简单解析 2. List容器创建3. 访问操作(get, iterator, for)4. 修改操作(add, remove, set)5. 容量操作(clear, contains, isEmpty, size)6. 其他操作(toArray, )7. 泛型操作 1.容器介绍 1.1 容器接口结构 a. Java存储结构划分   Java…

通过使用动态ip解决网络连接问题

互联网的使用已经成为我们生活中不可或缺的一种生活方式。但是&#xff0c;有时候我们会遇到网络连接问题&#xff0c;如IP地址冲突、网络瘫痪等等。这种情况往往会影响我们的工作&#xff0c;现在我们一般使用动态ip地址来解决这些问题。 一、什么是动态ip地址 动态IP地址是由…

小白也可以做智慧大屏?我来帮你踩踩坑!【华为云Astro低代码体验季】

前提 进入华为云官网进行操作&#xff1a;https://www.huaweicloud.com/ Astro的便捷 其内部丰富的组件&#xff0c;简洁的操作&#xff0c;可支持独立空间管理&#xff0c;让人可以在短时间内就完成非常炫酷以及功能完善的页面 进入编辑页面后&#xff0c;可通过选择左侧的…