代码随想录算法训练营第三十八天|509. 斐波那契数,70.爬楼梯,746. 使用最小花费爬楼梯

news2025/5/18 15:03:43

动态规划(DP)

如果某一问题有很多重叠子问题,使用动态规划是最有效的。
所以动态规划中每一个状态一定是由上一个状态推导出来的

一、动态规划包含哪些问题?

1、基础问题,如斐波那契数
2、背包问题,很经典的问题
3、打家劫舍
4、股票问题
5、子序列问题,如最长子序列,编辑距离等

二、动态规划的解题步骤

1、确定dp数组(dp table)以及下标的含义,用dp数组来保存递归的结果
2、确定递推公式(核心)
3、dp数组如何初始化
4、确定遍历顺序
5、举例推导dp数组

509. 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1给你n ,请计算 F(n)。

在这里插入图片描述

题目链接/讲解链接:
https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html

思路

按照动态规划五部曲来解题。
1、确定dp数组及下标的含义。dp[i]表示:第i个数的斐波那契数值为dp[i]
2、确定递归公式。本题给出条件:F(n) = F(n -1) + F(n -2),其中 n > 1,
所以递归公式就是dp[i] = dp[i -1] + dp[i -2]
3、初始化dp数组。本题也以给出:dp[0] = 0,dp[1] = 1
4、确定遍历的顺序。从递归公式dp[i] = dp[i -1] + dp[i -2];中可以看出,dp[i]是依赖 dp[i -1]和dp[i -2],那么遍历的顺序一定是从前到后遍历的
5、举例推导dp数组。这是一个验证的过程,例如当n为10的时候,dp数组应该是如下的数列:
0 1 1 2 3 5 8 13 21 34 55

解题

class Solution {
public:
    int fib(int n) {
        if (n <= 1) return n;
        vector<int> dp(n + 1);//0-n是有n+1个数
        dp[0] = 0;
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

70.爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬1或2个台阶。
你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n是一个正整数。

在这里插入图片描述

题目链接/讲解链接:
https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html

思路

动态规划五部曲。
1、确定dp数组和下标的含义。dp[i]表示:到达第i阶楼梯有dp[i]种方法。
2、确定递归公式。
dp[i]可以有两个方向推出来。
首先是dp[i -1],上i-1层楼梯,有dp[i -1]种方法,那么再一步跳一个台阶就是dp[i];
还有就是dp[i-2],上i-2层楼梯,有dp[i-2]种方法,那么再一步跳两个台阶也是dp[i]。
那么dp[i]就是 dp[i-1]与dp[i-2]之和。
所以递归公式为dp[i] = dp[i-1] + dp[i-2]。
3、初始化dp数组。
在我看来,题目中的条件:1 <= n <= 45,就不需要考虑dp[0]的情况,直接初始化dp[1]和dp[2]:
dp[1]=1,dp[2]=2。
4、确定遍历的顺序。从前往后
5、举例推导dp数组。

解题

class Solution {
public:
    int climbStairs(int n) {
        if (n <= 1) return n; // 因为下面直接对dp[2]操作了,防止空指针
        vector<int> dp(n + 1);
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) { // 注意i是从3开始的
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
};

题目:746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i]是从楼梯第 i个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为0或下标为1的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。

在这里插入图片描述

题目链接/讲解链接:
https://programmercarl.com/0746.%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E8%8A%B1%E8%B4%B9%E7%88%AC%E6%A5%BC%E6%A2%AF.html

思路

五部曲:
1、确定dp数组和下标的含义。
dp[i]表示:爬到第i个台阶的最低花费是dp[i]。
2、确定递推公式。
我们如何可以到达第i个台阶?
有两种方式:
可以从第i-1个台阶往上爬一个台阶到第i个台阶,花费的总体力为从开始到达第i-1个台阶的dp[i-1]加上从第i-1个台阶爬到第i个台阶花费的体力cost[i-1];
还可以从第i-2个台阶往上爬两个台阶到第i个台阶,花费的总体力为从开始到达第i-2个台阶的dp[i-2]加上从第i-2个台阶爬到第i个台阶花费的体力cost[i-1];
dp[i]是最低花费,所以可以得到递归公式为:

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

3、初始化dp数组。
看一下递归公式,dp[i]由dp[i-1],dp[i-2]推出,既然初始化所有的dp[i]是不可能的,那么只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]和dp[1]推出。

那么 dp[0]应该是多少呢?
题目描述中说了“你可以选择从下标为0或下标为1的台阶开始爬楼梯。” 也就是第0个台阶或者第1个台阶是不花费的,但从第0个台阶或者第1个台阶往上跳的话,需要花费 cost[0]或者cost[1]。
所以初始化 dp[0] = 0,dp[1] = 0
4、确定遍历顺序。从前往后。
5、举例推导dp数组。如下图:
在这里插入图片描述

解题

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        vector<int> dp(cost.size()+1);//我们最终到达的是楼顶,楼顶的位置是在cost数组的外面,因此要比cost数组大
        //初始化dp数组,我们可以选择从0或者1号楼梯开始爬,因此我们到达0或者1号楼梯是不需要花费体力的,cost[0]和cost[1]表示的是已经站在0或者1号楼梯楼了,往上爬需要花费的体力
        dp[0]=0;
        dp[1]=0;
        for(int i =2;i<=cost.size();i++)
        {
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[cost.size()];
    }
};

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

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

相关文章

操作系统命令(贪吃蛇项目)

&#x1f3dd;1.获得句柄 GetStdHandle是⼀个Windows API函数。它用于从⼀个特定的标准设备&#xff08;标准输入、标准输出或标 准错误&#xff09;中取得⼀个句柄&#xff08;用来标识不同设备的数值&#xff09;&#xff0c;使用这个句柄可以操作设备。 ⛳️函数原型&…

Git使用总结(不断更新中)

branch 本地分支操作 删除本地分支 git branch -d <local-branch-name>远端分支操作 从远端分支创建本地分支 git checkout -b <local-branch-name> origin/<remote-branch-name>git ignore 如果工程的代码文件中有不希望上传到远端的文件&#xff0c;…

【Linux学习】Linux权限管理(一)

文章标题 &#x1f680;Linux用户分类&#x1f680;Linux权限管理&#x1f680;文件访问者的分类&#xff08;人&#xff09;&#x1f680;文件类型和访问权限&#xff08;事物属性&#xff09;&#x1f680;怎么修改权限 &#x1f680;Linux用户分类 Linux下有两种用户&#…

使用Hugo、Github Pages搭建自己的博客

文章目录 搭建博客框架及对比使用Hugo搭建博客使用Github Pages部署博客 搭建博客框架及对比 在众多的博客框架中&#xff0c;Hugo、Jekyll和Hexo因其出色的性能和易用性而备受推崇。 特点HugoJekyllHexo速度极高中等较高易用性高中等高&#xff08;熟悉JavaScript者&#xf…

力扣112,路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点 是指没有子节点…

怎样实现opc采集数据后传给web后端

现在很多老工厂要进行数字化改造&#xff0c;现场生产的各种数据需要传到web后端&#xff0c;很多工厂现场原有的自动监控系统已经采集了现场的各种数据&#xff0c;只是没有形成联网。如果前端自动化系统全部废除&#xff0c;重新做数字化控制系统&#xff0c;成本投入太大&am…

GIS地理信息平台+智慧巡检技术解决方案(Word原件)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 3.系统功能设计 3.1.功能清单列表软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项…

风速Weibull分布和光伏Beta分布的参数拟合方法(含matlab算例)

在风光场景生成、随机优化调度等研究中&#xff0c;常常假设风速服从Weibull分布&#xff0c;太阳辐照度服从Beta分布。那我们如何得到两个分布的参数呢&#xff1f;文本首先介绍了风速Weibull分布和辐照度Beta分布的基本概率模型及其性性质&#xff0c;之后以MATLAB代码为例阐…

Linux操作系统-10-Iptables

一、iptables防火墙介绍 无论IPtables还是Firewalld都是对netfilter防火墙框架进行的命令层的封装 1、三件事 防火墙做的三件事&#xff1a; 获取流量匹配规则给出反馈&#xff08;accept、drop&#xff09; iptables的特性&#xff1a;表、链、规则 2、五张表 五张表&a…

数据湖技术选型——Flink+Paimon 方向

文章目录 前言Apache Iceberg存储索引metadataFormat V2小文件 Delta LakeApache Hudi存储索引COWMOR元数据表 Apache PaimonLSMTagconsumerChangelogPartial Update 前言 对比读写性能和对流批一体的支持情况&#xff0c;建议选择Apache Paimon截止2024年1月12日数据湖四大开…

【计算机毕业设计】微信小程序:MHK自学平台的设计与实现——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

Swagger + SwaggerUI

用的是SpringBoot2、jdk11、<spring-boot.version>2.3.3.RELEASE</spring-boot.version> &#xff08;单纯的swagger还是不如knife界面好用好看&#xff09; 1.导入依赖 <dependency> <groupId>io.springfox</groupId> <art…

SpringBoot项目调用讯飞星火认知大模型

文章目录 注册讯飞星火平台&#xff0c;领取免费token引入SDKapplication.xml中进行配置config文件读取配置信息编写代码调用接口进行测试 官方文档&#xff1a; https://www.xfyun.cn/doc/spark/Web.html#_1-%E6%8E%A5%E5%8F%A3%E8%AF%B4%E6%98%8E 注册讯飞星火平台&#xff…

管道流设计模式结合业务

文章目录 流程图代码实现pomcontextEventContextBizTypeAbstractEventContext filterEventFilterAbstractEventFilterEventFilterChainFilterChainPipelineDefaultEventFilterChain selectorFilterSelectorDefaultFilterSelector 调用代码PipelineApplicationcontrollerentitys…

线上线下交友社区系统 可打包小程序 支持二开 源码交付!

社交网络的普及&#xff0c;人们交友的方式发生了巨大的变化。过去&#xff0c;我们主要通过线下的方式来结识新朋友&#xff0c;比如在学校、工作场所、社交活动或者兴趣小组中。然而&#xff0c;随着移动端软件的发展&#xff0c;线上交友也逐渐变得流行。 方便性&#xff1a…

FreeRTOS学习 -- 中断配置

一、什么是中断 中断时微控制器一个很常见的特性&#xff0c;中断是由硬件产生&#xff0c;当中断产生以后CPU就会中断当前的流程而去处理中断服务&#xff0c;Cortex-M内核的MCU提供了一个用于中断管理的嵌套向量中断控制器&#xff08;NVIC&#xff09;。 二、中断优先级分…

波士顿动力抛弃液压机器人Atlas,推出全新电动化机器人,动作超灵活

本周&#xff0c;机器人科技巨头波士顿动力宣布液压Atlas退役&#xff0c;并推出了下一代产品——专为实际应用而设计的全电动Atlas机器人&#xff0c;这也意味着人形机器人迈出了商业化的第一步。 Atlas——人形机器人鼻祖 Atlas&#xff08;阿特拉斯&#xff09;这个名字最…

为什么有的云渲染注册条件哪么多?有没有注册条件少的?

随着云渲染技术的普及&#xff0c;越来越多的设计师、艺术家和企业开始依赖这一强大的工具来加速创作过程。但是在我们注册账号的时候你会发现不同平台间的注册条件不同&#xff0c;一些平台在用户注册过程中设置了一系列繁琐的验证环节&#xff0c;让我们填那种无意义的数字或…

java体育馆使用预约平台的设计与实现(springboot+mysql源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体育馆使用预约平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 体育馆使用预约平台的…

ruoyi-nbcio-plus基于vue3的多租户机制

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…