动态规划入门篇——斐波那契数列与爬楼梯问题

这篇具有很好参考价值的文章主要介绍了动态规划入门篇——斐波那契数列与爬楼梯问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、认识动态规划

       动态规划(Dynamic Programming,简称DP)是运筹学的一个分支,也是求解多阶段决策过程最优化问题的一种方法。它主要用来解决一类最优化问题,通过将复杂问题分解成若干个子问题,并综合子问题的最优解来得到原问题的最优解。动态规划的核心在于对问题的状态进行定义和描述状态之间的关系,使得问题能够以递推(或者说分治)的方式解决。

       简称DP,在解决算法问题中,如果这个问题是由多个子问题重叠,那么使用动态规划来解决问题是最好的选择,它的每一个状态都需要上一个状态推导而成。

二、如何去完成动态规划类的问题

        大家多多少少都有了解,动态规划关键是递推公式,所以有人就会认为背下几个递推公式就足以完成算法题目,显然不是如此。在一些基础的算法题可能有效,但是遇上了有难度的题目可能就有些不够用了。

        了解动态规划的递推公式固然重要,但不仅仅于此。

        那么有以下四步做题关键非常重要,

        1.确定动态数组,也就是dp[ ],以及其下标的意义

        2.明确动态公式

        3.数组的初始化

        4.遍历顺序的确定

        就算知道了递推公式,不了解其数组含义,还有遍历顺序,那么这题多半也是很难做下去!

三、斐波那契数列

       初识这个问题,想必都是在函数递归时接触到,一道非常基础入门的题目,作为动态规划的入门也是极为合适。

        斐波那契数,由F(n)表示。该数列由0和1开始,后面的每一项数字都是前面两项之和,即 F(0) = 0 ,F(n) = 1,F(n) = F(n-1) +F(n-2),给出n,计算出F(n)。

        在这里就不做过多的分析,直接利用前文的四个做题步骤

        1.明确dp数组和下标的意义

        那么在本题,dp[ i ]的含义为斐波那契数列的第i个数的值。

        2.明确解题公式

        题目中已经很明确的说出公式,因此为dp[ i ] = dp[ i - 1 ] + dp [ i - 2].

        3.数组初始化

        题目也已经给出,dp[ 0 ] = 0,dp[ 1 ] = 1.

        4.确定遍历顺序

        dp[ i ] 得出结果需要依靠dp[ i - 1 ]和dp[ i - 2 ]来实现,所以遍历的顺序是从前往后遍历。

        

        代码如下:

int fit(int n)
    {
        if(n <= 1)
           return n;
        vector<int> dp(n);
        dp[0] = 0;
        dp[1] = 1;
        for(int i = 2;i <= n;i++)
        {
            dp[i] = dp[i-1] + dp[i-2];
        }
            return dp[n];
    }

    完成初步的了解后,还可以对此题解进行优化,我们观察到该递归公式,只需要关注dp[i-1]和dp[i-2]两个数即可,那么 我们只需记录两个数就够了,然后利用这两个数层层往后推导,不需要记录整个数列。

        优化后代码:

int fit(int n)
  {
     if( n <= 1)
     return n;
     int dp[2];
     dp[0] = 0;
     dp[1] = 1;
     for(int i = 2;i<=n;i++)
       {
         int a = dp[0] + dp[1];
         dp[0] = dp[1];//利用两个变量来承接上一层循环的结果
         dp[1] = a;
        }

    return a;
    }

四、爬楼梯问题

       假如你现在正在爬楼梯,需要爬n阶才能到楼顶。你每一步可以爬一到两个台阶,那么你有几种方法能到达楼顶呢?

       其实这道题也能分解成一个个的子问题,刚开始接触可能确实不太好想,那如果试着一阶一阶的来往后递推,就会很好思考,例如爬上第一阶只需要迈一步,那么就只有一种方法,而第二层那要么就是从第一层迈一层,或者在第0层迈两层,就有了两种方法,那么第三层呢,就需要从第一层的状态和第二层推导出来,所以就可以说,到达第三层的方法是第一层和第二层的方法数的和。其实这样一分析,这个题目其实是斐波那契数列的一个拓展。

        接下来还是按照四个步骤往下走,

        1.明确dp数组和其下标的含义

          与斐波那契数一样,这里的dp[i]是指到达第i个阶梯,有多少种方法

        2.明确递推公式        

        与斐波那契数一样,公式为dp[i] = dp[i-1] + dp[i-2],由下面阶层的方法累加出上面阶层的方法数。

        3.初始化

        在此题有一个很尴尬的地方,那就是对于第0层的方法数的看法不一,题目的见解大家各有千秋,那么这里就打算使用dp[1]和dp[2]来作为初始化的两个值

        dp[1] = 1,dp[2] = 2。

        4.确定遍历顺序

        还是与斐波那契数列一样,这里的循环条件需要由前面的子问题来累加出来得出结果,所以是一个从前往后的循环条件。

        代码如下: 

int climb(int n)
    {
        if (n<=1)
        return n;
        vector<int> dp(n);
        dp[1] = 1;
        dp[2] = 2;
        for(int i = 3;i <= n ;i++)
        {
            dp[i] = dp[i - 1]+dp[i - 2];
        }
            return dp[i];
        }

那么这道题的优化方法依旧与上题一样,不再过多赘述。

此题还可以更改很多类型的爬楼梯问题,例如可以一口气爬1,2,3层楼梯,以及爬一层楼梯我需要耗费多少力气,那么爬到顶需要耗费多少力气?大家可以多去钻研!

 文章来源地址https://www.toymoban.com/news/detail-839540.html

到了这里,关于动态规划入门篇——斐波那契数列与爬楼梯问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【动态规划】斐波那契数列模型

    冻龟算法系列之斐波那契数列模型 动态规划(英语:Dynamic programming,简称 DP) ,是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质

    2024年02月09日
    浏览(64)
  • 【算法学习】斐波那契数列模型-动态规划

            我在算法学习过程中,针对斐波那契数列模型的动态规划的例题进行了一个整理,并且根据标准且可靠一点的动态规划解题思路进行求解类似的动归问题,来达到学习和今后复习的必要。         所谓的斐波那契数列模型,即当前状态的值等于前两种状态的值之和。

    2024年02月04日
    浏览(56)
  • C++算法 —— 动态规划(1)斐波那契数列模型

    每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路,看接下来的博客也就更轻松了。当然,我也会尽量在写每一篇时都可以让不懂这个算法的人也能边看边理解。 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅

    2024年02月10日
    浏览(46)
  • 【算法优选】 动态规划之斐波那契数列模型

    动态规划相关题目都可以参考以下五个步骤进行解答: 状态表⽰ 状态转移⽅程 初始化 填表顺序 返回值 后面题的解答思路也将按照这五个步骤进行讲解。 泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 给你整数 n,请返回第 n 个泰波那契

    2024年02月05日
    浏览(56)
  • 动态规划解决泰波那契数列,爬楼梯最小花费问题

    做题之前我们需要先搞清楚解决动态规划的几个步骤 1 状态表示,准备一个dp表 2 状态转移方程  3 初始化 4 填表 5 返回值 步骤1 状态表示,准备dp表 dp[0] dp[1] dp[2] dp[3] dp[4] = dp[0]+dp[1]+dp[3] 步骤2 状态转移方程表示 dp[i] = dp[i-1]+dp[i-2]+dp[i-3] 步骤3 4 5 都是对代码的细节处理,代码

    2024年02月03日
    浏览(35)
  • 【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数

    本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:动态规划专栏 🚚代码仓库:小小unicorn的代码仓库🚚

    2024年02月21日
    浏览(43)
  • 算法刷题Day 38 动态规划理论基础+斐波那契数+爬楼梯

    动态规划的解题步骤: 确定 dp 数组(dp table)以及下标的含义 确定递推公式 dp 数组如何初始化 确定遍历顺序 举例推导 dp 数组 很基础

    2024年02月15日
    浏览(63)
  • 算法Day38 | 动态规划,509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯

    动态规划是一种解决问题的算法思想。它通常用于优化问题,其中要求找到一个最优解或最大化(最小化)某个目标函数。 动态规划的核心思想是 将问题分解成更小的子问题,并通过存储子问题的解来避免重复计算 。这样,可以通过解决子问题来构建原始问题的解。动态规

    2024年02月09日
    浏览(58)
  • Java【动态规划】斐波那契数列模型, 图文思路详解 + 代码实现

    本篇总结动态规划中的 斐波那契数列模型 的解法和思路 按照以下流程进行分析题目和代码编写 思路分析步骤 代码编写步骤 1, 状态表示 1, 构造 dp 表 2, 状态转移方程 2, 初始化+边界处理 3, 初始化 3, 填表(抄状态转移方程) 4, 填表顺序 4, 返回结果 5, 返回值 / OJ链接 题目分析

    2024年02月08日
    浏览(60)
  • 【动态规划专栏】专题一:斐波那契数列模型--------2.三步问题

    本专栏内容为:算法学习专栏,分为优选算法专栏,贪心算法专栏,动态规划专栏以及递归,搜索与回溯算法专栏四部分。 通过本专栏的深入学习,你可以了解并掌握算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:动态规划专栏 🚚代码仓库:小小unicorn的代码仓库🚚

    2024年02月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包