动态规划(一)——斐波那契数列模型

news2024/9/24 17:14:02

文章目录

  • 斐波那契数列模型
    • 第N个泰波那契数
  • 补充:空间优化——滚动数组
    • 三步问题
    • 最小花费爬楼梯
    • 解码方法

斐波那契数列模型

回头总结

斐波那契数列模型一般都是线性dp,对于这类DP题目的状态表示一般是 以i为结尾,…
分析状态转移方程时要特别注意:最近的一次状态,怎么转化过来的,几种情况


第N个泰波那契数

1137. 第 N 个泰波那契数 - 力扣(LeetCode)


【五步分析】

  • 状态表示

    根据题目要求,易知dp表的每个元素dp[i]为第 i 个泰波那契数

  • 状态转移方程

    题目给出:Tn+3 = Tn + Tn+1 + Tn+2,将该式化简得:Tn = Tn-3 + Tn-2 + Tn-1

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

  • 初始化

    初始化要保证不越界,根据状态转移方程可知dp[0]、dp[1]、dp[2]需要初始化,初始化值题目给出

    另外还要处理边界情况,当题目所求的是第0、1个泰波那契数时,初始化dp表可能会出现越界问题,我们要单独处理

  • 填表顺序

    从左往右,保证填写当前状态值时,所需状态值均计算过

  • 返回值

    根据题目要求和状态表示,可知返回值为dp[n]。另外,由于泰波那契数从0开始,所以我们的dp表要申请 n+1 个空间。


【代码编写】

class Solution {
    public int tribonacci(int n) {
        if(n == 0) {
            return 0;
        }
        if(n == 1) {
            return 1;
        }
        //创建dp表
        int[] dp = new int[n + 1];
        //初始化
        dp[1] = dp[2] = 1;
        //填表
        for(int i = 3; i < dp.length; i++) {
            dp[i] = dp[i-3] + dp[i-2] + dp[i-1];
        }
        //返回值
        return dp[n];
    }
}

补充:空间优化——滚动数组

以第N个泰波那契数为例,填表时只需要当前状态的前三个状态的值,并且返回值也是最后填入的状态值,随着不断填表,前面的空间相当于浪费了,这时候采用滚动数组的思想进行空间优化:

    public int tribonacci(int n) {
        if(n == 0) {
            return 0;
        }
        if(n == 1 || n == 2) {
            return 1;
        }
        //创建并初始化
        int a = 0,b = 1,c = 1,d = 0;
        //"填表"
        for(int i = 3; i <= n; i++) {
            d = a + b + c;
            a = b;
            b = c;
            c = d;
        }
        //返回值
        return d;
    }

三步问题

面试题 08.01. 三步问题 - 力扣(LeetCode)


【五步分析】

  • 状态表示

    根据经验,dp[i]表示到达i位置时,方法总数

  • 状态转移方程

    由于到达dp[i]位置可以选择走1步、2步或者3步,所以可以分三种情况:

    1. 先到达dp[i-1]的位置,然后走一步
    2. 先到达dp[i-2]的位置,然后走两步
    3. 先到达dp[i-3]的位置,然后走三步

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

  • 初始化

    dp[0]、dp[1]、dp[2]。同时,要处理边界情况。

  • 填表顺序

    从左往右,保证填写当前状态值时,所需状态值均计算过

  • 返回值

    返回值就是最后一个填表的状态值dp[n-1]


【代码编写】

class Solution {
    public int waysToStep(int n) {
        if(n == 1) {
            return 1;
        }
        if(n == 2) {
            return 2;
        }
        //创建dp表
        int mod = (int)1e9 + 7;
        int[] dp = new int[n];
        //初始化
        dp[0] = 1;
        dp[1] = 2;
        dp[2] = 4;
        //填表
        for(int i = 3; i < dp.length; i++) {
            dp[i] = (((dp[i-1] + dp[i-2])%mod) + dp[i-3])%mod;
        }
        //返回值
        return dp[n-1];
    }
}

【分析时板书】

在这里插入图片描述


最小花费爬楼梯

746. 使用最小花费爬楼梯 - 力扣(LeetCode)


【五步分析】

  • 状态表示

    根据经验+要求,dp[i]表示到达i位置时的最小花费

  • 状态转移方程

    由于到达dp[i]位置可以选择走1步或者2步,所以具体可以分两种情况:

    1. 先到达dp[i-1]的位置,然后支付cost[i-1]走一步,总花费:dp[i-1]+cost[i-1]
    2. 先到达dp[i-2]的位置,然后支付cost[i-2]走两步,总花费:dp[i-2]+cost[i-2]

    由于要寻找最小花费,所以状态转移方程为:dp[i] = min(dp[i-2]+cost[i-2], dp[i-1]+cost[i-1])

  • 初始化

    dp[0]、dp[1]。同时,要处理边界情况。

  • 填表顺序

    从左往右,保证填写当前状态值时,所需状态值均计算过

  • 返回值

    返回值就是最后一个填表的状态值dp[cost.length],这是因为到达数组最后一个位置不算是到达楼顶,必须再到达下一个,也正因为如此dp表的长度为cost.length+1


【代码编写】

class Solution {
    public int minCostClimbingStairs(int[] cost) {
        //创建dp表
        int[] dp = new int[cost.length+1];
        //初始化
        dp[0] = dp[1] = 0;
        //填表
        for(int i = 2; i < dp.length; i++) {
            dp[i] = Math.min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);
        }
        //返回值
        return dp[cost.length];
    }
}

【分析时板书】

在这里插入图片描述

该题目的dp[i]也可以是从 i 位置开始,到达楼顶的最小花费,即将 i 位置作为起点而非终点,此时状态转移方程为:dp[i] = min(dp[i+1]+cost[i+1], dp[i+2]+cost[i+2]),此时填表顺序是从右往左,返回值则是min(dp[0], dp[1])


解码方法

91. 解码方法 - 力扣(LeetCode)


【五步分析】

  • 状态表示

    根据经验+要求,dp[i]表示以 i 位置为结尾时,编码方法总数

  • ★ 状态转移方程

    分析dp[i]的最近的一步:

    新加一个字符时,该字符可能可以单独编码;也可能和前一个字符结合编码,我们得讨论它们的可能性:

    1. 单独编码:‘0’不能单独编码,如果为’0’,则该字符单独编码情况下的方式为0;否则,就是dp[i-1]种方式
    2. 结合编码:将这两个字符结合成一个数字,如果10 <= 结合后的数字 <= 26(01、02…不能解码),则可以结合编码,结合后看作一个整体,所以方法有dp[i-2]种;否则,解码失败,方法数为0。

    所以状态转移方程为:dp[i] = dp[i-1](单独解码成功) + dp[i-2](结合编码成功)

  • ★ 初始化

    易分析:dp[0]、dp[1]需要初始化,

    字符串的第一个字符只要不为’0’,dp[0] = 1;否则解码方式一定为0,可以直接return 0;

    第二个字符不为’0’,则dp[1] = 2;否则,解码方式一定是0

  • 填表顺序

    从左往右,保证填写当前状态值时,所需状态值均计算过

  • 返回值

    返回值就是最后一个填表的状态值dp[s.length()-1]


【代码编写】

class Solution {
    public int numDecodings(String s)  {
    int c0 = Character.getNumericValue(s.charAt(0));
    if(c0 == 0) {
        return 0;
    }
    //创建dp表
    int[] dp = new int[s.length()];
    //初始化
    dp[0] = 1;
    if(s.length() == 1) {
        return dp[0];
    }
    int c1 = Character.getNumericValue(s.charAt(1));
    if(c1 != 0) {
        int tmp = c0 * 10 + c1;
        if(tmp <= 26 && tmp >= 10) {
            dp[1] = 2;
        }else {
            dp[1] = 1;
        }
    }else {
        if(c0 == 1 || c0 == 2) {
            dp[1] = 1;
        }else {
            return 0;
        }
    }
    //填表
    for(int i = 2; i < dp.length; i++) {
        int prev = Character.getNumericValue(s.charAt(i-1));
        int cur = Character.getNumericValue(s.charAt(i));
        int total = prev * 10 + cur;
        int dp1 = 0;
        int dp2 = 0;
        if(prev == 0 && cur == 0) {
            return 0;
        }else {
            //单独解码
            if(cur >= 1 && cur <= 9) {
                dp1 = dp[i-1];
            }
            if(total >= 10 && total <= 26) {
                dp2 = dp[i-2];
            }
        }
        dp[i] = dp1 + dp2;
    }
    return dp[s.length()-1];
    }
}

【分析时板书】

在这里插入图片描述


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

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

相关文章

google vr 入门之VrPanoramaView制作全景图列表(1)

展示图片的列表我这里使用RecycleView&#xff0c;activity_main.xml <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android“http://schemas.android.com/apk/res/android” xmlns:tools“http://schemas.android.com/tool…

又一个iPhone时代开始

今年的苹果秋季发布会在昨晚召开了&#xff0c;今天早上我们也看到了很多相关的新闻。我猜你看完后的感觉可能是&#xff0c;这不过又是一次普普通通的参数升级。又是提升了百分之多少&#xff0c;又是增加了多少倍——非常简单的一些更新。比如说芯片升级了、相机的摄像头一会…

【机器学习】7 ——k近邻算法

机器学习7——k近邻 输入&#xff1a;实例的特征向量 输出&#xff1a;类别 懒惰学习&#xff08;lazy learning&#xff09;的代表算法 文章目录 机器学习7——k近邻1.k近邻2.模型——距离&#xff0c;k&#xff0c;分类规则2.1距离——相似程度的反映2.2 k值分类规则 算法实…

Datawhale X 李宏毅苹果书 AI夏令营 《深度学习详解》第十九章 ChatGPT

19.1 ChatGPT 简介和功能 1、对话框可以输入任何东西 2、可以继续追问 19.2 对于 ChatGPT 的误解 1、第一个误解是 ChatGPT 的回答是罐头讯息 2、另外一个常见的误解是 ChatGPT 的答案是网络搜索的结果 3、那 ChatGPT 真正在做的事情是什么呢&#xff1f;一言以蔽之就是做…

【F179】基于Springboot+vue实现的幼儿园管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 系统管理也都将通过计算机进行整体智能化操作&#xff…

Adobe Acrobat DC无法将图片转换成PDF?教你用Python快速解决,最后附上集成小程序!

存在问题 当用Adobe Acrobat DC想将图片转换成PDF的时候&#xff0c;有时候会报错&#xff0c;如下&#xff1a; 多次尝试还是出现这个问题。 解决方案 基于Python代码实现 from PIL import Image import osdef images_to_pdf(input_folder, output_pdf):""&quo…

Emlog程序屏蔽用户IP拉黑名单插件

插件介绍 在很多时候我们需要得到用户的真实IP地址&#xff0c;例如&#xff0c;日志记录&#xff0c;地理定位&#xff0c;将用户信息&#xff0c;网站数据分析等,其实获取IP地址很简单&#xff0c;感兴趣的可以参考一下。 今天给大家带来舍力写的emlog插件&#xff1a;屏蔽…

【办公类】大组工会学习(文心一言+Python批量)

背景需求&#xff1a; 每学期要写一份工会的大组政治学习读后感&#xff08;9月-1月&#xff0c;共5次&#xff09; 学习内容 9月、10月、11月、12月、1月的学习内容文字稿 在班级里&#xff0c;我擅长电脑工作&#xff0c;所以这种写的工作都包了。 中2班三位老师一共写3篇&…

社区版IDEA连接MySQL数据库以及使用的详细方法

1、下载插件 由于社区版没有为我们提供DataBase&#xff0c;所有需要我们自己去下载DataBase插件。 步骤如下&#xff1a;1、File->Settings &#xff08;图片序号标错&#xff09;2、Plugins->搜索DataBase Navigator&#xff0c;点击install安装&#xff0c;安装…

新火种AI|估值飙升到千亿美元!OpenAI拿什么去支撑这惊人身价?

作者&#xff1a;小岩 编辑&#xff1a;彩云 OpenAI又有大动作了。 近期&#xff0c;有消息曝出&#xff0c;OpenAI正在进行新一轮的融资。此次融资阵仗极大&#xff0c;OpenAI很可能在本轮融资后估值飙升至千亿美元&#xff0c;成为全球范围内的“超级巨头”。 千亿估值的…

【机器学习-监督学习】集成学习与梯度提升决策树

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

erlang学习: Mnesia Erlang数据库3

Mnesia数据库删除实现和事务处理 -module(test_mnesia). -include_lib("stdlib/include/qlc.hrl").-record(shop, {item, quantity, cost}). %% API -export([insert/3, select/0, select/1, delete/1, transaction/1,start/0, do_this_once/0]). start() ->mnes…

[SAP ABAP] 清空ABAP变量

使用关键字CLEAR将变量中的值设置为默认值 代码结果如下所示

Win10磁盘出现小锁和感叹号的解决办法

很多说在设置-系统安全&#xff0c;但是我的么有&#xff0c;只能上命令了&#xff0c;管理员身份运行powerShell: su 速度比较慢&#xff0c;耐心等待会&#xff0c;每次查看状态加密的百分比都是减少哦 manage-bde -off G: manage-bde -status

JS获取URL参数的几种方法

JS获取URL参数的几种方法 在Web开发中&#xff0c;经常需要从URL中提取参数来进行相应的操作。本文将深度解析在JavaScript中获取URL参数的几种方法&#xff0c;并附带一些扩展与高级技巧。希望对你有所帮助&#xff01; 一、JS获取URL参数包含哪些方式 1. 使用URL对象 现代浏览…

BCLinux您的授权码是无效的,请获得正确的授权码来注册大云Linux操作系统

更新yum源老弹出这个&#xff0c;很烦人。 [rootlocalhost yum.repos.d]# yum clean all 服务器检查结果: ***信息***您的授权码是无效的&#xff0c;请获得正确的授权码来注册大云Linux操作系统。您可以使用bclinux-license -g命令获得机器码&#xff0c;然后与我们联系帮您产…

JavaScript语言基础知识

文章目录 前言一、JavaScript语言是什么&#xff1f;二、基础知识 1.语法2.关键字3.数据类型4.变量定义及其使用5.运算符的使用总结 前言 JavaScript是Web页面中一种比较流行的脚本语言&#xff0c;它通过客户端浏览器解释执行&#xff0c;可以应用在JSP、PHP、ASP等网站中。随…

编码与实现

1. 程序设计语言 1.1 程序设计语言的概述 程序设计语言是用于书写计算机程序的语言&#xff0c;是一种实现性软件语言。最早的机器语言&#xff0c;到汇编语言&#xff0c;到现在的高级语言。语言的发展越来越规范、简单&#xff0c;代码的复用性越来越高。程序员逐渐从复杂的…

curl和ping

curl获取页面内容&#xff0c;ping测试连通 curl和ping是两个在网络环境中常用的命令行工具&#xff0c;但它们的目的和应用场景有很大的不同。 curl 用途&#xff1a;curl是一个命令行工具&#xff0c;用于传输数据&#xff0c;支持多种协议&#xff0c;包括HTTP、HTTPS、FT…

KaiwuDB 受邀亮相 2024 数博会

8月28-30日&#xff0c;由国家数据局主办&#xff0c;贵州省人民政府承办的 2024 中国国际大数据产业博览会&#xff08;简称“数博会”&#xff09;在贵阳启幕。KaiwuDB 受邀携一众产品亮相大会&#xff0c;重点展示了分布式多模数据库 KaiwuDB 2.0 及其在物联网海量异构数据管…