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

news/2024/7/7 19:38:22

 示例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://lihuaxi.xjx100.cn/news/950537.html

相关文章

C语言易错小贴士

1.数组建立以及strlen&#xff1a; char arr1[]"bit"; char arr2[]{b,i,t}; char arr3[]{b,i,t,\0}; 1&#xff09;其中arr1数组需要注意默认为4个字符&#xff0c;和arr3包含的内容是一致的&#xff1b; 2&#xff09;arr2末尾没有\0&#xff0c;后面是数组越界的…

【数据结构(四)】树

文章目录树1 树的基本概念1.1 树的定义1.2 基本术语1.3 数的性质2 二叉树的概念2.1 二叉树的定义与特性2.1.1 定义2.1.2 二叉树的性质2.2 几种特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树2.3 二叉树的存储结构2.3.1 顺序存储2.3.2 链式存储3 二叉树的遍历和线索二叉树3.1 二叉…

cast提前!最简单有效的神经网络优化方法,没有之一!

做优化有时候真的很头疼&#xff0c;绞尽脑汁的想怎么做算法等价&#xff0c;怎么把神经网络各层指令流水起来&#xff0c;在确保整网精度的同时&#xff0c;又有高性能。 但有时做了半天&#xff0c;却发现流水根本就流不起来&#xff0c;总是莫名其妙地被卡住。 真的是一顿…

PHP使用chilkat入门教程

前言&#xff1a; 我们需要先确认自己的版本&#xff0c;在PHP中&#xff0c;可以利用phpinfo()函数来查看php是ts版本还是nts版本&#xff0c;该方法可以展示出当前phpinfo信息&#xff0c;若“Thread Safety”项的信息是“enabled”&#xff0c;一般来说就表示ts版本&#xf…

数学小课堂:微积分复盘(高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。)

文章目录 引言I 复盘1.1 概念和表述1.2 现实与虚构1.3 有穷和无穷1.4 静态和动态1.5 直觉和逻辑II 通过数学逻辑,理解人生。2.1 精明与聪明2.2 朋友和理性的对手2.3 攒钱和赚钱2.4 荣誉和财富引言 高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。 I 复盘 1.…

3月来了,给自己做一个简单的nodejs后端技术总结

3月来了,给自己做一个简单的nodejs后端技术总结 3月来了,给自己做一个简单的nodejs后端技术总结 完全重构 数据库切换迁移Why Nestjs?prisma or typeorm?serverless 函数辅助GraphQLGithub Action CI/CD部署 tensorflow 模型 我又滚回来写文章了&#xff0c;从去年11月底…

Synchronized的锁升级过程

Synchronized的锁升级过程 synchronized锁升级过程&#xff1a;在synchronized中引入了偏向锁、轻量级锁、重量级锁之后&#xff0c;当前具体使用的是synchronzed中的那种类型锁&#xff0c;是根据线程竞争激烈程度来决定的。 偏向锁&#xff1a;在锁对象的对象头中记录一下当…

js中判断数组的方式有哪些?

js中判断数组的方式有哪些&#xff1f;1.通过Object.prototype.toString.call来判断2.通过instanceof来判断3.通过constructor来判断4.通过原型链来判断5.通过ES6.Array.isAaary()来判断6.通过Array.prototype.isPrototypeOf来判断1.通过Object.prototype.toString.call来判断 …