动态规划专训1——泰波那契数列模型

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

动态规划的思想:将一个问题分隔为若干个子问题,完成子问题得到结构再得到最终的答案

动态规划往往解题步骤固定,分为以下几步

1.找出状态表示

2.完成状态转移方程

3.初始化

4.填表顺序

5.返回值

后面三步偏重细节,二解题的核心就在于前两步,所以要想练好动态规划,大量的练习,见识更多的题型无疑是很重要的,下面我们开始今天的练习

1.第N个泰波那契数

1137. 第 N 个泰波那契数

泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值

这道题目很简单,旨在让我们熟悉动态规划的解题步骤,下面我们展开分析

1.状态表示:用dp[ i ]表示第 i 个泰波那契数

2.状态转移方程:dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ]

3.初始化:dp[0] = 0; dp[1] = 1; dp[2] = 1

4.填表顺序:从左往右依次填

5.返回值:dp[n]

当然我们要注意边缘数据的特殊处理,不然会出现越界的情况

class Solution {
public:
    int tribonacci(int n) 
    {
        //1. 创建dp表
        //2. 初始化
        //3. 填表
        //4. 返回值

        //边缘数据处理
        if(n == 0 || n == 1) return n;
        if(n == 2) return 1;

        vector<int> dp(n + 1);
        dp[0] = 0; dp[1] = 1; dp[2] = 1;
        for(int i = 3; i <= n; ++i)
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];

        return dp[n]; 
    }
};

这是ac代码

2.三步问题

面试题 08.01. 三步问题

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007

1.状态表示:用dp[ i ]表示上到第i个台阶的可能方式

2.状态转移方程:dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] + dp[ i - 3 ]

3.初始化:dp[0] = 0; dp[1] = 1; dp[2] = 1

4.填表顺序:从左往右依次填

5.返回值:dp[n]

这里要注意数据的处理,因为数据很大,每一次相加之后都要对题给数据取模

class Solution {
public:
    int waysToStep(int n) 
    {
        const int MOD = 1e9 + 7;
        if(n == 1 || n == 2) return n;

        vector<int> dp(n + 1);
        dp[0] = 1; dp[1] = 1; dp[2] = 2;
        for(int i = 3; i <= n; ++i)
            dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + + dp[i - 3]) % MOD; 

        return dp[n]; 
    }
};

这是ac代码

3.使用最小花费爬楼梯

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

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

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

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

1.状态表示:用dp[ i ]表示上到第i个阶梯需要的最小费用

2.状态转移方程:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])

3.初始化:dp[0] = 0; dp[1] = 0;

4.填表顺序:从左往右依次填

5.返回值:dp[n]

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
        int n = cost.size();
        
        vector<int> dp(n + 1);
        dp[0] = 0; dp[1] = 0;
        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];
    }
};

这是ac代码

4.解码方法

91. 解码方法

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> "1"
'B' -> "2"
...
'Z' -> "26"

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法

1.状态表示:用dp[ i ]表示上到第i - 1个字母最大解码方法

2.状态转移方程:dp[i] = dp[i - 1] + dp[i - 2](要判断是否存在该情况)

3.初始化:dp[0] = 1; dp[1] = s[0] != '0';

4.填表顺序:从左往右依次填

5.返回值:dp[n]

class Solution {
public:
    int numDecodings(string s) 
    {
        int n = s.size();

        vector<int> dp(n + 1);
        dp[0] = 1; 
        dp[1] = s[0] != '0';
        for(int i = 2; i <= n; ++i)
        {
            if(s[i - 1] != '0') dp[i] += dp[i - 1];
            int num = (s[i - 2] -'0') * 10 + s[i - 1] - '0';
            if(num >= 10 && num <= 26) dp[i] += dp[i - 2];
        }

        return dp[n];
    }
};

这是ac代码

新手写博客,有不对的位置希望大佬们能够指出,也谢谢大家能看到这里,让我们一起学习进步吧!文章来源地址https://www.toymoban.com/news/detail-861748.html

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

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

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

相关文章

  • 动态规划入门:斐波那契数列模型以及多状态(C++)

        动态规划(Dynamic programming,简称 DP)是一种解决多阶段决策问题的算法思想。它将问题分解为多个阶段,并通过保存中间结果来避免重复计算,从而提高效率。 动态规划的解题步骤一般分为以下几步: 思考状态表示,创建dp表(重点) 分析出状态转移方程(重点) 初始化 确定

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

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

    2024年02月08日
    浏览(1)
  • 【动态规划】是泰波那契数,不是斐波那契数

    Problem: 1137. 第 N 个泰波那契数 首先我们来解读一下本题的意思🔍 相信读者在看到【泰波那契数】的时候,不禁会联想到【斐波那契数】,它们呢是一对孪生兄弟,这个 泰波那契数 相当于是 斐波那契数 的加强版 我们首先可以来看到这个递推公式 Tn+3 = Tn + Tn+1 + Tn+2 ,读者可

    2024年02月08日
    浏览(1)
  • 【学会动态规划】第 N 个泰波那契数(1)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 4. 空间优化 写在最后 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:1137. 第 N 个泰波那

    2024年02月15日
    浏览(1)
  • 【学会动态规划】第 N 个泰波那契数(4)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 这道题目不难理解,就是根据题目给的字

    2024年02月16日
    浏览(1)
  • LeetCode第 N 个泰波那契数 (认识动态规划)

    链接: 第 N 个泰波那契数 编写代码 代码空间优化 一般像这种情况我们可以使用滚动数组的方式来解决空间的问题

    2024年02月15日
    浏览(1)
  • LeetCode、1137. 第 N 个泰波那契数【简单,动态规划】

    博主介绍:✌目前全网粉丝2W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、算法、分布式微服务、中间件、前端、运维、ROS等。 博主所有博客文件目录索引:博客目录索引(持续更新) 视频平台:

    2024年02月22日
    浏览(1)
  • 【动态规划刷题 1 】 第N个泰波那契数&& 三步问题

    链接: 第N个泰波那契数 1137 . 第 N 个泰波那契数 泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 给你整数 n,请返回第 n 个泰波那契数 Tn 的值。 示例 1: 输入:n = 4 输出:4 解释: T_3 = 0 + 1 + 1 = 2 T_4 = 1 + 1 + 2 = 4 示例 2: 输入:n = 25 输出:

    2024年02月15日
    浏览(1)
  • 动态规划入门篇——斐波那契数列与爬楼梯问题

           动态规划(Dynamic Programming,简称DP)是运筹学的一个分支,也是求解多阶段决策过程最优化问题的一种方法。它主要用来解决一类最优化问题,通过将复杂问题分解成若干个子问题,并综合子问题的最优解来得到原问题的最优解。动态规划的核心在于对问题的状态进

    2024年03月14日
    浏览(1)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包