动态规划初阶-爬楼梯问题

news2025/1/16 18:54:11

 示例1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

提示:

  • 2 <= cost.length <= 1000
  • 0 <= cost[i] <= 999

简要地介绍一下动态规划算法:

       动态规划算法是一个上限极高的算法,题型和考法多变,对于初学者来说不太有好,动态规划法最主要的就是得到状态方程,可能刚开始这些概念会比较陌生,我这里举个例子,

我们都直到著名的斐波那切数列的递推公式:      f[i]=f[i-1]+f[i-2]

其实这个就是最简单的状态方程,一个位置上的状态,又=由上一个或者几个的状态来决定,这就是最基本的动态规划法的应用。

动态规划,无非就是利用历史记录,来避免我们的重复计算。而这些历史记录,我们得需要一些变量来保存,一般是用一维数组或者二维数组来保存。

下面回到我们刚才的问题上来

问题思路:对于上面的问题来说,我们可以选择从第0阶或者第1阶台阶开始走,所以我们有不同走法的阶数应该从第2阶开始,

从第2阶开始后的第i阶台阶,我们有两种走法:

      1.消耗mincost[i-1]的花费,跨越1阶到达第i阶台阶,其中mincost[i]表示的是到达第i阶台阶的的花费,这里的花费不包括要从第i-1阶台阶上走向第i阶的花费(即cost[i-1]),则此时mincost[i]=mincost[i-1]+cost[i-1];

      2.消耗mincost[i-2]的花费,直接跨越两级台阶到达第i阶台阶,则此时mincost[i]=mincost[i-2]+cost[i-2];

可见,当到达最后的一阶的顶层时,可以得到两中方法中最小的一个,即可求出答案。

在上面的问题中,题目规定我们可以从第0或者第1阶台阶开始走,那么就有mincost[0]=mincost[1]=0;

在这里我们不必担心会有路径不连通的问题,因为我们的每一步选择都是随机的,所以我们的每一步不是走一步就是走两步,不论怎样一定是连通的,我们只需要在两种到达的方案中每次取最小的一种就好了。

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
       int n=cost.size();
       vector<int> ans(n+1);
       ans[0]=ans[1]=0;
       for(int i=2;i<=n;i++)
         ans[i]=min(ans[i-1]+cost[i-1],ans[i-2]+cost[i-2]);
        return ans[n];
    }
};

写在最后:

     这是对于动态规划问题的初步认识和了解,后序我也会整理更加详细的讲解和大家分享,希望大家可以留下或者分享对于创作的宝贵意见,我会努力去写出质量更高的好作品。

       距离高考还有短短一百天了,虽然现在已经是个大学生了,但回首过往,仍旧心潮澎湃,那无数个晚睡早起的日子,怎么学都不会感到累的日子,依旧让我怀念,不管最后结果如何,至少拼尽全力,多年以后,你会发现,那段时光,会是你最美好的回忆。

 

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

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

相关文章

使用Docker安装MongoDB,整合SpringBoot

使用Docker安装MongoDB MongoDB 和 MySQL 都是常用的数据库管理系统&#xff0c;但它们的设计目标不同&#xff0c;因此在某些方面的性能表现也有所不同。 MongoDB 是一个文档型数据库&#xff0c;它采用了面向文档的数据模型&#xff0c;支持动态查询和索引&#xff0c;适合…

Docker部署实战

文章目录Docker部署应用准备制作容器镜像启动容器上传镜像docker exec数据卷&#xff08;Volume&#xff09;声明原理实践Docker部署 应用准备 这一次&#xff0c;我们来用 Docker 部署一个用 Python 编写的 Web 应用。这个应用的代码部分&#xff08;app.py&#xff09;非常…

【同步、共享和内容协作软件】上海道宁与​ownCloud让您的团队随时随地在任何设备上轻松处理数据

ownCloud是 一款开源文件同步、共享和 内容协作软件 可让团队随时随地 在任何设备上轻松处理数据 ownCloud开发并提供 用于内容协作的开源软件 使团队能够轻松地无缝 共享和处理文件 而无需考虑设备或位置 开发商介绍 ownCloud成立于2010年&#xff0c;是一个托管和同…

设计模式-笔记

文章目录七大原则单例模式桥模式 bridge观察者模式 observer责任链模式 Chain of Responsibility命令模式 Command迭代器模式 Iterator中介者模式 Mediator享元模式 Flyweight Pattern组合模式 composite装饰模式 Decorator外观模式 Facade简单工厂模式工厂方法模式工厂抽象模式…

Postgresql中的unlogged table

在PG中&#xff0c;有一种表的类型为unlogged table&#xff0c;名如其字&#xff0c;该种类型的表不会写入wal日志中&#xff0c;所以在写入的速度上比普通的堆表快很多&#xff0c;但是该表在数据库崩溃的时候&#xff0c;会被truncate,数据会丢失&#xff0c;而且该表也不支…

Leetcode21. 合并两个有序链表

一、题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4]输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2…

Java程序开发中如何使用lntelliJ IDEA?

完成了IDEA的安装与启动&#xff0c;下面使用IDEA创建一个Java程序&#xff0c;实现在控制台上打印HelloWorld!的功能&#xff0c;具体步骤如下。 1.创建Java项目 进入New Project界面后&#xff0c;单击New Project选项按钮创建新项目&#xff0c;弹出New Project对话框&…

【k8s】Kubernetes的学习(1.k8s概念和架构)

目录 1.首先要知道&#xff0c;Kubernetes为什么简称为k8s? 2.Kubernetes概述 2.1 kubernetes基本介绍 2.2 kubernetes的特性 2.3 kubernetes集群架构组件 2.3.1 Master (主控节点) 2.3.2 node (工作节点) 2.4 k8s核心概念 2.4.1 Pod 2.4.2 controller 2.4.3 Se…

操作系统权限提升(十九)之Linux提权-SUID提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限&#xff0c;设置了suid的程序文件&#xff0c;在用户执行该程序时&#xff0c;用户的权限是该程序文件属主的权限&#xff0c;例如程序文件的属主是root&#xff0c;那么执行该…

redux-saga

redux-saga 官网&#xff1a;About | Redux-Saga 中文网&#xff1a;自述 Redux-Saga redux-saga 是一个用于管理 异步获取数据(副作用) 的redux中间件&#xff1b;它的目标是让副作用管理更容易&#xff0c;执行更高效&#xff0c;测试更简单&#xff0c;处理故障时更容易… …

C#:Krypton控件使用方法详解(第十讲) ——kryptonColorButton

今天介绍的Krypton控件中的kryptonColorButton&#xff0c;下面介绍这个控件的外观属性&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;EmptyBorderColor属性&#xff1a;表示当所选颜色为空时&#x…

七、JUC并发工具

文章目录JUC并发工具CountDownLatch应用&源码分析CountDownLatch介绍CountDownLatch应用CountDownLatch源码分析有参构造await方法countDown方法CyclicBarrier应用&源码分析CyclicBarrier介绍CyclicBarrier应用CyclicBarrier源码分析CyclicBarrier的核心属性CyclicBarr…

echarts实现知识图谱,生产项目

echarts实现知识图谱&#xff0c;生产项目内容简介效果演示代码逻辑结束语内容简介 在实际生产项目中&#xff0c;需要对后端知识数据进行展示。需求如下&#xff1a; 点击节点可以展示与此节点相关的节点信息右键点击节点可以对节点的信息进行修改悬浮在节点上可以查看节点的…

通用人工智能(AGI):人工智能的下一个阶段

除了人工智能(AI)的改进和新应用之外&#xff0c;大多数人都认为&#xff0c;当通用人工智能(AGI)出现时&#xff0c;人工智能的下一次飞跃将发生。我们将AGI宽泛地定义为机器或计算机程序理解或学习人类可以完成的任何智力任务的假设能力。然而&#xff0c;对于何时以及如何实…

系统性能测试指标

性能测试的目的 1.评估系统的能力&#xff0c;测试中得到的负荷和响应时间数据可以被用于验证所计划的模型的能力&#xff0c;并帮助作出决策。 2.识别体系中的弱点&#xff1a;受控的负荷可以被增加到一个极端的水平&#xff0c;并突破它&#xff0c;从而修复体系的瓶颈或薄…

leetcode: Swapping Nodes in a Linked List

leetcode: Swapping Nodes in a Linked List1. 题目描述2. 题目解答3. 总结1. 题目描述 You are given the head of a linked list, and an integer k.Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node f…

ECMAScript 详解

ECMAScript 历史我们首先来看 ECMA 是什么。ECMA&#xff0c;是欧洲计算机制造商协会&#xff08;European Computer Manufacturers Association&#xff09;的简称&#xff0c;是一家国际性会员制度的信息和电信标准组织。1994 年之后&#xff0c;由于组织的标准牵涉到很多其他…

【Leetcode 剑指Offer】第 6 天 搜索与回溯算法(简单)

搜索与回溯剑指 Offer 32 - I. 从上到下打印二叉树层序遍历 广搜 BFScollections双端队列 deque剑指 Offer 32 - II. 从上到下打印二叉树 II剑指 Offer 32 - III. 从上到下打印二叉树 III剑指 Offer 32 - I. 从上到下打印二叉树 题;从上到下打印出二叉树的每个节点&#xff0c…

单通道说话人语音分离——DPRNN(Dual-Path Recurrent Neural Network)

参考文献&#xff1a;《DUAL-PATH RNN: EFFICIENT LONG SEQUENCE MODELING FOR TIME-DOMAIN SINGLE-CHANNEL SPEECH SEPARATION》 DPRNN网络是Con-Tasnet的改进网络 Con-Tasnet介绍详情请看上一篇文章 单通道说话人语音分离——Conv-TasNet(Convolutional Time-domain audio…

应用程序性能优化方案,web服务五级缓存优化,服务器性能优化...

winfrom 全局异常捕获WPF 全局异常捕获Asp.Net全局异常捕获MVC 全局异常捕获AspNetNetCore 全局异常捕获一级缓存html/css/js 前端缓存二级缓存Asp.Net MVC AspNetCore 客户端缓存设置三级缓存服务端缓存四级redis 数据库缓存服务端缓存五级sqlserver 数据库缓存设置分布式缓存…