【动态规划专栏】专题一:斐波那契数列模型--------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执行优化
386 1
|
Prometheus Cloud Native Java
微服务框架(二十三)Prometheus + Grafana 安装、配置及使用
此系列文章将会描述Java框架Spring Boot、服务治理框架Dubbo、应用容器引擎Docker,及使用Spring Boot集成Dubbo、Mybatis等开源框架,其中穿插着Spring Boot中日志切面等技术的实现,然后通过gitlab-CI以持续集成为Docker镜像。 本文为Prometheus + Grafana 安装、配置及使用 本系列文章中所使用的框架版本为Spring ...
|
12月前
|
编解码 前端开发 搜索推荐
如何建立自己的体育直播平台-源码搭建全流程
随着在线观看体育赛事用户的爆发式增长,搭建专业体育直播应用成为趋势。利用如熊猫比分的全链路解决方案,创业者可快速启动平台。主要步骤包括前期技术准备(赛事API接口、服务器配置、域名选择、短信服务、云直播服务)、定制化(LOGO标识、功能测试与优化)及正式上线与运营(推广、持续更新、主播入驻)。此方案使创业者能高效进入体育市场,抓住机遇。
|
7月前
|
人工智能 自然语言处理 Java
通义零码智能体测评
这是一款强大的AI辅助编程工具,核心功能包括:代码智能生成,基于上下文快速提供行级/函数级代码建议;研发智能问答,解答各类技术问题;AI程序员支持多文件协同修改与任务处理;行间代码生成,实时续写及注释转代码;编码问题解决,涵盖代码优化、问题修复及Java异常排查,全面提升开发效率。
216 4
|
SQL 数据处理 数据库
|
存储 Ubuntu 安全
在Ubuntu 16.04上安装和配置Nextcloud的方法
在Ubuntu 16.04上安装和配置Nextcloud的方法
367 0
|
Python
运行项目时flask_sqlalchemy报错AttributeError: ‘LocalStack‘ object has no attribute ‘__ident_func__‘
1.原因 是由于flask_sqlalchemy版本不匹配导致的,我们需要自动获取正确的包版本
1182 1
|
弹性计算 运维 监控
系统运维 SysOM profiling 在云上环境的应用观测实践 | 龙蜥技术
通过部署 profiling,直击 CPU 指标异常等问题的第一现场。
系统运维 SysOM profiling 在云上环境的应用观测实践 | 龙蜥技术
|
开发工具 git
Compose中实现原生TabView+ViewPager的效果
Compose中实现原生TabView+ViewPager的效果
1683 0
Compose中实现原生TabView+ViewPager的效果
|
机器学习/深度学习 算法 C语言
[最全算法总结]我是如何将递归算法的复杂度优化到O(1)的
[最全算法总结]我是如何将递归算法的复杂度优化到O(1)的
453 0
[最全算法总结]我是如何将递归算法的复杂度优化到O(1)的

热门文章

最新文章