【动态规划专栏】专题一:斐波那契数列模型--------3.最小花费爬楼梯

简介: 【动态规划专栏】专题一:斐波那契数列模型--------3.最小花费爬楼梯


题目来源

本题来源为:

Leetcode LCR 088. 使用最小花费爬楼梯

题目描述

数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。

每当爬上一个阶梯都要花费对应的体力值,一旦支付了相应的体力值,就可以选择向上爬一个阶梯或者爬两个阶梯。

请找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。

题目解析

通过题目给的两个实例来分析一下题目:

注意:楼顶是在整个数组外面而不是数组的最后一个位置。

每次爬楼梯只能爬一层或者两层。

算法原理

解法一:

1.状态表示

经验+题目要求:

以i位置为结尾…

对于本题而言就是:

dp[i]表示:以i位置为结尾时,最小花费

2.状态转移方程

在推方程之前,我们先画一下可能遇到的情况:

通过画图,我们知道到达i位置会有两种情况。

我们根据最近的一步来划分问题:

因此,本题的状态转移方程为:

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

3.初始化

本题会出现越界的情况为0位置和1位置:

因此本题初始化为:

dp[0]=dp[1]=0;

4.填表顺序

根据状态转移方程,我们计算dp[i]位置的值需要i-1与i-2位置的值,因此我们的填表顺序为:从左往右

5.返回值

dp[n]

代码实现

class Solution 
{
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        // 1.创建dp表
        // 2.初始化
        // 3.填表
        // 4.返回值
        int n=cost.size();
        vector<int> dp(n+1);
        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];
    }
};

解法二:

1.状态表示

经验+题目要求:

以i位置为结尾…

对于本题而言就是:

dp[i]表示:以i位置为开始时,到达楼顶时的最小花费

2.状态转移方程

在推方程之前,我们先画一下可能遇到的情况:

通过画图,我们知道到达i位置会有两种情况。

我们根据最近的一步来划分问题:

因此,本题的状态转移方程为:

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

3.初始化

因为最终要到达n位置,因此要初始化n-1与n-2的位置:

因此初始化为:

dp[n-1]=cost[n-1];
dp[n-2]=cost[n-2];

4.填表顺序

根据状态转移方程,我们计算dp[i]位置的值需要i+1与i+2位置的值,因此我们的填表顺序为:从右往左

5.返回值

返回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);
        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]+cost[i],dp[i+2]+cost[i]);
        }
        return min(dp[0],dp[1]);
    }
};

时间复杂度:O(N)

空间复杂度:O(N)

相关文章
|
SQL 分布式计算 监控
Hive性能优化之计算Job执行优化 2
Hive性能优化之计算Job执行优化
395 1
|
Prometheus Cloud Native Java
微服务框架(二十三)Prometheus + Grafana 安装、配置及使用
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Prometheus + Grafana 安装、配置及使用 本系列文章中所使用的框架版本为Spring ...
|
安全 JavaScript Java
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
2614 0
记一次网站全站http升级为https的过程,websocket : ws升级为wss遇到的问题等
|
JSON JavaScript Linux
【MCP教程系列】如何自己打包MCP服务并部署到阿里云百炼上
本文章以阿里云百炼的工作流为例,介绍如何将其封装为MCP服务并部署到平台。主要步骤包括:1)使用Node.js和TypeScript搭建MCP服务;2)将项目打包并发布至npm官方平台;3)在阿里云百炼平台创建自定义MCP服务;4)将服务添加到智能体中进行测试。通过这些步骤,您可以轻松实现工作流的MCP化,并在智能体中调用自定义服务。
3944 107
|
11月前
|
人工智能 API
MMedAgent:专为医疗领域设计的多模态 AI 智能体,支持医学影像处理、报告生成等多种医疗任务
MMedAgent 是专为医疗领域设计的多模态AI智能体,支持多种医疗任务,包括医学影像处理、报告生成等,性能优于现有开源方法。
619 19
MMedAgent:专为医疗领域设计的多模态 AI 智能体,支持医学影像处理、报告生成等多种医疗任务
|
NoSQL API Redis
最佳实践|如何使用c++开发redis module
本文将试着总结Tair用c++开发redis module中遇到的一些问题并沉淀为最佳实践,希望对redis module的使用者和开发者带来一些帮助(部分最佳实践也适用于c和其他语言)。
76962 0
|
存储 Windows
如何删除DMP文件
如何删除DMP文件
1998 12
|
缓存 开发工具 git
Git创建分支以及合并分支
在Git中,创建分支使用`git branch [branch_name]`,切换分支使用`git checkout [branch_name]`。修改文件后,通过`git add [file]`添加到暂存区,然后`git commit`提交到本地仓库。如果是新建分支的第一次推送,使用`git push origin [branch_name]`推送到远程仓库,之后可以简化为`git push`。合并分支时,使用`git merge [branch_name]`将指定分支的更改合并到当前分支。
508 2
Git创建分支以及合并分支
|
机器学习/深度学习 存储 测试技术
从0到1:如何规划一套流量回放自动化测试方案
本文介绍了流量回放自动化测试的完整方法,从企业战略到交付的四个关键环节:Discovery(深度挖掘)、Define(定义目标)、Design(详细设计)和Delivery(交付与反馈)。通过这些步骤,帮助企业优化系统性能和稳定性,确保产品的高质量。
358 4
|
编解码 前端开发 搜索推荐
如何建立自己的体育直播平台-源码搭建全流程
随着在线观看体育赛事用户的爆发式增长,搭建专业体育直播应用成为趋势。利用如熊猫比分的全链路解决方案,创业者可快速启动平台。主要步骤包括前期技术准备(赛事API接口、服务器配置、域名选择、短信服务、云直播服务)、定制化(LOGO标识、功能测试与优化)及正式上线与运营(推广、持续更新、主播入驻)。此方案使创业者能高效进入体育市场,抓住机遇。