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

news2024/11/14 16:56:51

一、第 N 个泰波那契数

题目链接: 第 N 个泰波那契数

题目描述:

题目分析:

1、状态表示:

dp[i] 表示:第 i 个斐波那契数的值

2、状态转移方程:

由题意可知第 i 个数等于其前三个数之和

dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

3、初始化:

由于递推公式中存在 i-1、i-2、i-3,当 i=0、1、2的时候,就会出现-1,-2,-3这种非法的下标值,导致数组访问异常。因此,我们需要在填表前将 0,1,2 位置的值初始化。题目中也直接告诉了我们这些位置的初始值:

dp[0]=0 、 dp[1]=1 、 dp[2]=1

4、优化

其实每次在求取 dp[i] 的时候,只需要知道其前三个元素的值即可。也就是说我们在每次更新后只需要保存最后的三个数即可。通过三个数的值就能更新出下一个 dp 值。

代码实现:

class Solution {
    public int tribonacci(int n) {
        int[] dp=new int[]{0,1,1};
        if(n==0)return 0;
        if(n<3)return 1;
        for(int i=3;i<=n;i++){
            dp[i%3]=dp[0]+dp[1]+dp[2];
        }
        return dp[n%3];
    }
}

二、三步问题

题目链接: 三步问题

题目描述:

题目分析:

1、状态表示:

dp[i] 表⽰:到达 i 位置时,⼀共有多少种⽅法。

2、状态转移方程:

到达第 i 级台阶的所有方法我们不好确定,但我们可以确定到达第 i 级台阶的上一步只有三种可能:

  • 从 i-1置上一级台阶,且到达 i-1 位置的方法数为 dp[i-1]
  • 从 i-2置上二级台阶,且到达 i-2 位置的方法数为 dp[i-2]
  • 从 i-3置上三级台阶,且到达 i-3 位置的方法数为 dp[i-3]

而到达第 i 级台阶的方法数就应该为其所有上一步的方式之和:

因此dp[i]=dp[i-1] + dp[i-2] + dp[i-3]

注意:由于这里计算的结果可能会很大。因此我们需要对结果进行取模。并且为了防止求和时溢出,在每次求和时都要先取模再求和

3、初始化:

由于递推公式中存在 i-1、i-2、i-3,当 i=0、1、2的时候,就会出现-1,-2,-3这种非法的下标值,导致数组访问异常。因此,我们需要在填表前将 0,1,2 位置的值初始化。由题意很容易就能求出这些位置的初始值:

dp[0]=1 、 dp[1]=2 、 dp[2]=4

代码实现:

class Solution {
    public int waysToStep(int n) {
        if(n==1||n==2)return n;
        if(n==3)return 4;
        int[] dp=new int[n+1];
        dp[1]=1;dp[2]=2;dp[3]=4;
        int MOD=(int)1e9+7;
        for(int i=4;i<=n;i++){
            dp[i]=((dp[i-1]+dp[i-2])%MOD+dp[i-3])%MOD;
        }
        return dp[n];
    }
}

三、 使用最小花费爬楼梯

题目链接:使用最小花费爬楼梯

题目描述:

题目分析:

1、状态表示:

dp[i] 表⽰:到达 i 位置时的最⼩花费。

2、状态转移方程:

根据最近的⼀步,分情况讨论:
  • 先到达 i - 1 的位置,然后⽀付 cost[i - 1] ,接下来⾛⼀步⾛到 i 位置:

        dp[i - 1] + csot[i - 1] 

  • 先到达 i - 2 的位置,然后⽀付 cost[i - 2] ,接下来⾛⼀步⾛到 i 位置:

        dp[i - 2] + csot[i - 2] 

我们每次只需要取两种情况的最小值即可。

因此:dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

3、初始化:

很明显 i=0 或 i=1时是无法使用递推公式的。因此我们需要先把他们给初始化了。

由题意可得 dp[0] = dp[1] = 0 ,因为可以直接选择从第0级或第1级台阶开始爬楼梯,不需要任何花费

代码实现:

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n=cost.length;
        int[] dp=new int[n+1];
        for(int i=2;i<=n;i++){
            dp[i]=Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[n];
    }
}

四、解码方法

题目链接: 解码方法

题目描述:

题目分析:

1、状态表示:

dp[i] 表⽰:字符串中 [0 i] 区间上,⼀共有多少种编码⽅法。

2、状态转移方程:

关于 i 位置的编码状况,我们可以分为下⾯两种情况:
  • i 位置上的数单独解码成⼀个字⺟;
  • i 位置上的数与 i - 1 位置上的数结合,解码成⼀个字⺟。
下⾯我们就上⾯的两种解码情况,继续分析:
让 i 位置上的数单独解码成⼀个字⺟,就存在两种情况:
  • 解码成功:i 位置上的数在 [1, 9] 之间的时候,说明 i 位置上的数是可以单独解码的,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 1] 区间上的解码⽅法。因为 [0, i - 1] 区间上的所有解码结果,后⾯填上⼀个 i 位置解码后的字⺟就可以了。此时 dp[i] = dp[i - 1]
  • 解码失败:i 位置上的数是 0 的时候,说明 i 位置上的数是不能单独解码的,那么此时 [0, i] 区间上不存在解码⽅法。因为 i 位置如果单独参与解码,但是解码失败了,那么前⾯做的努⼒就全部⽩费了。此时 dp[i] = 0
让 i 位置上的数与 i - 1 位置上的数结合在⼀起,解码成⼀个字⺟,也存在两种情况:
  • 解码成功:当结合的数在 [10, 26] 之间的时候,说明 [i - 1, i] 两个位置是可以解码成功的,那么此时 [0, i] 区间上的解码⽅法应该等于 [0, i - 2 ] 区间上的解码⽅法,原因同上。此时 dp[i] = dp[i - 2] 
  • 解码失败:当结合的数在 [0, 9] [27 , 99] 之间的时候,说明两个位置结合后解码失败(这⾥⼀定要注意 00 01 02 03 04 ...... 这⼏种情况),那么此时 [0, i] 区间上的解码⽅法就不存在了,原因依旧同上。此时 dp[i] = 0
综上所述: dp[i] 最终的结果应该是上⾯四种情况下,解码成功的两种的累加和,因此可以得到状态转移⽅程
  • s[i] 上的数在 [1, 9] 区间上时: dp[i] += dp[i - 1] 
  • s[i - 1] s[i] 上的数结合后,在 [10, 26] 之间的时候: dp[i] += dp[i - 2] 
  • 如果上述两个判断都不成⽴,说明没有解码⽅法, dp[i] 就是默认值 0

3、初始化:

可以在最前⾯加上⼀个辅助结点,帮助我们初始化。这时 dp[i] 就表示 [0 i] 区间上的编码数。这里当前两个数能成功解码时,dp[2]就应该要加上 dp[0] 的值,因此我们需要让 dp[0] 初始化为 1。 

代码实现:

class Solution {
    public int numDecodings(String s) {
        char[] cs=s.toCharArray();
        int n=s.length();
        if(cs[0]-'0'==0)return 0;
        int[] dp=new int[n+1];
        dp[1]=1;
        dp[0]=1;
        for(int i=2;i<=n;i++){
            if(cs[i-1]-'0'!=0)
                dp[i]=dp[i-1];
            if(cs[i-2]-'0'==0)continue;
            int x=(cs[i-2]-'0')*10+cs[i-1]-'0';
            if(x<=26){
                dp[i]+=dp[i-2];
            }
        }
        return dp[n];
    }
}


那么本篇文章就到此为止了,如果觉得这篇文章对你有帮助的话,可以点一下关注和点赞来支持作者哦。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238024.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 第五次周赛

A: 直接遍历即可 #include<bits/stdc.h> using namespace std;typedef long long ll; typedef pair<ll, ll>PII; const int N 2e6 10; const int MOD 998244353; const int INF 0X3F3F3F3F;int n, m; int main() {cin >> n;int cnt 0;for(int i 0; i …

【数据库系列】postgresql链接详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Uniapp底部导航栏设置(附带PS填充图标教程)

首先需要注册和登录ifconfont官网&#xff0c;然后创建项目添加需要的图标 创建和添加图标库请参考&#xff1a;Uniapp在Vue环境中引入iconfont图标库&#xff08;详细教程&#xff09; 打开iconfont官网&#xff0c;找到之前添加的图标库&#xff0c;下载png图片 如果需要的…

提取神经网络数学表达式

来自《老饼讲解神经网络》 www..bbbdata.com 当我们在matlab训练好网络后&#xff0c;可以使用神经网络工具箱的sim(net,x)函数进行预测输出。但往往想提取出它的数学表达式&#xff0c;该怎么提取呢&#xff1f; 下面以《一个简单的神经网络例子》中的模型为例&#xff0c;提取…

【从零开始鸿蒙开发:01】自定义闪屏页

文章目录 大体介绍文件介绍各部分代码SplashPage.etsIndex.etsHomePage.etsroute_map.jsonmodule.json5 流程 大体介绍 文件介绍 其中&#xff1a; pages为我们的页面内容&#xff08;我个人理解功能性小于activity但是大于fragment&#xff09;route_map.json 为自定义的路由…

录制的音频听起来非常缓慢,声音很模糊

一、主题 录制的音频听起来非常缓慢&#xff0c;声音很模糊 二、问题背景 硬件&#xff1a;T113&#xff0c;R528等平台系列产品 软件&#xff1a;Tina5.0 三、问题描述 1、复现步骤 使用arecord进行录音。 arecord -Dhw:audiocodec -f S16_LE -r 16000 -c 2 -d 5 /tmp/t…

Android笔记(三十五):用责任链模式封装一个App首页Dialog管理工具

背景 项目需要在首页弹一系列弹窗&#xff0c;每个弹窗是否弹出都有自己的策略&#xff0c;以及哪个优先弹出&#xff0c;哪个在上一个关闭后再弹出&#xff0c;为了更好管理&#xff0c;于是封装了一个Dialog管理工具 效果 整体采用责任链模块设计&#xff0c;控制优先级及弹…

[CKS] K8S Dockerfile和yaml文件安全检测

最近准备花一周的时间准备CKS考试&#xff0c;在准备考试中发现有一个题目关于Dockerfile和yaml文件安全检测的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

(Go语言)初上手Go?本篇文章帮拿捏Go的数据类型!

1. bool 类型 布尔类型&#xff1a;只有 true 和 false 两种值 在Go中&#xff0c;整数 0 不代表 false 值&#xff0c;1也不代表 true 值 即数字无法代替布尔值进行逻辑判断&#xff0c;两者是完全不同的类型 布尔类型占用 1 字节 2. int 整型 Go中为不同位数的整数分配…

用 Python 从零开始创建神经网络(四):激活函数(Activation Functions)

激活函数&#xff08;Activation Functions&#xff09; 引言1. 激活函数的种类a. 阶跃激活功能b. 线性激活函数c. Sigmoid激活函数d. ReLU 激活函数e. more 2. 为什么使用激活函数3. 隐藏层的线性激活4. 一对神经元的 ReLU 激活5. 在隐蔽层中激活 ReLU6. ReLU 激活函数代码7. …

【C++】—掌握STL string类:string的模拟实现

文章目录 &#x1f49e;1.浅拷贝&#x1f49e;2.深拷贝&#x1f49e;3. string类的模拟实现&#x1f49e;3.1 string的构造函数&#x1f49e;3.2 string的析构函数&#x1f49e;3.3 string的拷贝构造&#x1f49e;3.4 string的size&#x1f49e;3.5 string的operator[]&#x1…

元器件篇——自恢复保险丝(PPTC)

1 定义 保险丝&#xff08;Fuse&#xff09;也被称为电流保险丝。根据IEC127标准&#xff0c;将保险丝定义为熔断体。主要的作用就是起过载保护。电路中正确布置保险丝&#xff0c;当保险丝在电流异常升高到一定时&#xff0c;或者热度升高到一定时&#xff0c;自身熔断&#x…

多媒体信息检索

文章目录 一、绪论二、文本检索 (Text Retrieval)(一) 索引1.倒排索引2.TF-IDF (二) 信息检索模型 (IR模型&#xff0c;Information Retrieval)1.布尔模型 (Boolean模型)(1)扩展的布尔模型 (两个词)(2)P-Norm模型 (多个词) 2.向量空间模型 (Vector Space Model&#xff0c;VSM)…

Node.js——fs模块-文件夹操作

1、借助Node.js的能力&#xff0c;我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束&#xff0c;欢迎大家评论区…

ABAP:SET CURSOR FIELD设置鼠标焦点

SET CURSOR FIELD <字段名>&#xff1a;设置鼠标焦点到该字段 SET CURSOR 设置到鼠标焦点列还是行 SET CURSOR LINE 设置鼠标焦点到行 GET CURSOR field <字段名> &#xff1a;这个相对应的获取鼠标焦点得到的字段

Gitlab-执行器为Kubetnetes时的注意事项,解决DNS解析问题

一、Gitlab-Runner 这里对于Runner的理解非常重要。 具体执行ci流水线的叫执行器。执行器可以部署是shell、docker、k8s的pod.执行完任务则生命周期结束。 管理执行器的叫Gitlab-Runner。Runner则是与Gitlab Server的Ci agent.(可以简单这么理解) 二、执行器为Kubetnetes时,DN…

双向链表(带头双向循环链表)巨详解!!!

概念 本文讲述的双向链表&#xff0c;全名叫做带头双向循环链表&#xff0c;我们学习的链表总共有八种 在前文讲述单链表时所讲到的单链表&#xff0c;其实就叫做不带头单向不循环链表&#xff0c;这里的带头、不带头才是真正的头结点&#xff0c;前文中的头结点其实叫做首元素…

时序预测 | Python基于CNN-transformer时间序列预测

时序预测 | Python基于CNN-transformer时间序列预测 目录 时序预测 | Python基于CNN-transformer时间序列预测预测效果基本介绍参考资料 预测效果 基本介绍 时序预测 | Python基于CNN-transformer时间序列预测 Cnn-transformer-自适应稀疏自注意力ASSA-对比归一化contranorm预…

网站架构知识之Ansible进阶(day022)

1.handler触发器 应用场景&#xff1a;一般用于分发配置文件时候&#xff0c;如果配置文件有变化&#xff0c;则重启服务&#xff0c;如果没有变化&#xff0c;则不重启服务 案列01&#xff1a;分发nfs配置文件&#xff0c;若文件发生改变则重启服务 2.when判断 用于给ans运…