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

news2024/10/18 19:53:48

动态规划算法流程:

1、状态表示:

        指的是dp(dynamic programming)表里面的值所表示的含义

        如何得出:1、题目要求

                        2、经验+题目要求

                        3、分析问题的过程中发现重复子问题

2、状态转移方程

        dp[i]等于什么

3、初始化

        保证填表的时候不越界

4、填表顺序

        为了填写当前状态的时候,所需要的状态已经计算过了

5、返回值

        结合题目要求+状态表示

例题

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

1、状态表示

        根据题目要求,dp[i]表示第i个泰波那契数的值

2、状态转移方程

        dp[i]依赖于前三个数dp[i-1]、dp[i-2]、dp[i-3]

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

3、初始化

        为了使dp[i-1]、dp[i-2]、dp[i-3]不越界,需要初始化dp[0]=0、dp[1]=1、dp[2]=1

4、填表顺序

        从左向右

5、返回值

        dp[n]

代码实现:
class Solution {
    public int tribonacci(int n) {  
        //边界情况
        if(n==0) return 0;
        if(n==1||n==2) return 1;
        //状态方程
        int[] dp = new int[n+1];
        //初始化
        dp[0] = 0;
        dp[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];
    }
}
空间优化:滚动数组

O(n)-->O(1)

滚动操作:a = b, b = c, c = d

注意不能先将c = d,不然b就找不到c之前的位置了,要从前向后赋值

class Solution {
    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;
    }
}

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

题目解析

楼梯有1阶时,直接从起始位置迈一步就到1阶,共1种;有2阶时,可以从起始位置买两步,或者从1阶迈一步,共两种;有三阶时,可以从起始位置迈三步,从1阶迈两步,从二阶迈一步,总共四种。初学者可能会有疑问为什么是四种,因为迈到二阶的方法就两种,从二阶迈一步到三阶的结果还是两种而不是三种,因为这里指的是方法数,不是迈的步数,直接再迈二阶的方法后面加上->3,如下图。所以总方法是前三个迈台阶方法数之和。

1、状态表示

        根据题目加经验:以i位置为结尾,dp[i]表示正好到达第i个台阶总共有dp[i]种方法

2、状态转移方程

        

3、初始化

        因为dp[0]无意义就略去

        dp[1]=1;dp[2]=2;dp[3]=4

4、填表顺序

        从左往右

5、返回值

        dp[n]

细节处理,因为题目要对结果取模,所以要对每一次求和都要取模

dp[i] = ((dp[i-1]+dp[i-2])%(1e9+7)+dp[i-3])%(1e9+7)

代码实现:
class Solution {
    public int waysToStep(int n) {
        int Mod = (int)1e9+7;
        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;
        //填表
        for(int i = 4;i<=n;i++)
            dp[i] = ((dp[i-1]+dp[i-2])%Mod+dp[i-3])%Mod;
        //返回值
        return dp[n];
    }
}

此题也可以使用滚动数组进行空间优化,与第一题类似。

3、LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode)

题目解析:

先确定楼顶,如果楼顶为下标[n-1]的位置,则示例1的最小花费为10元,而实际为15,因此楼顶为n的位置。要到达某一位置台阶的花费最小,如果迈两步则总花费为到达i-2的最小花费+cost[i-2],如果迈一步则总花费为到达i-1的最小花费+cost[i-1],因此到此位置的最小花费为迈一步的最小花费与买两步的最小花费的最小值。

示例2:

1、状态表示

        根据题目加经验:以i位置为结尾,dp[i]表示正好到达第i个台阶最小的花费为dp[i]

2、状态转移方程

        dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])

3、初始化

        从起始位置到第一阶和第二阶都不需要花费

        dp[0]=dp[1]=0;

4、填表顺序

        从左往右

5、返回值

        dp[n]

代码实现:
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        //建表
        int[] dp = new int[n+1];
        //初始化
        dp[0] = 0;
        dp[1] = 0;
        //填表
        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];
    }
}

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

题目解析:

解码方式总共有两种,单独解码和两数一起解码

但也有不能解码的情况如下。

算法原理:

1、状态表示

        dp[i]表示以i位置为结尾,解码方法的总数

2、状态转移方程

        根据最近的一步,划分问题,dp[i]=dp[i-1]+dp[i-2]

‘单独解码’成功情况的解释,‘一起解码’同理

3、初始化

dp[0]和dp[1]

4、填表顺序

从左往右

5、返回值

dp[n-1]

代码实现:
class Solution {
    public int numDecodings(String s) {
        //1、创建dp表
        int n = s.length();
        int[] dp = new int[n];
        //2、初始化
        if(s.charAt(0)!='0') dp[0] = 1;

        if(n==1) return dp[0]; //边界情况

        char a = s.charAt(0);
        char b = s.charAt(1);
        if(b!='0'&&a!='0') dp[1]+=1;
        int t = (a-'0')*10+(b-'0');
        if(t>=10&&t<=26) dp[1]+=1;
        //3、填表
        for(int i = 2;i<n;i++)
        {
            if(s.charAt(i)>'0'&&s.charAt(i)<='9')  
                dp[i] += dp[i-1];
            t = (s.charAt(i-1)-'0')*10+(s.charAt(i)-'0');
            if(t>=10&&t<=26)  
                dp[i] += dp[i-2];
        }
        //4、返回值
        return dp[n-1];
    }
}

我们发现初始化的代码很复杂并且逻辑和填表的代码类似,因此我们可以添加辅助节点的方法来简化代码。

处理边界问题以及初始化的技巧:

虚拟位置初始化:为了以后填表正确,dp[0]需要为1,因为如果dp[2]和dp[1]填表正确,那么前面的填表也是正确的,如果为0说明前面解码不成功,因此要为1.

下标映射关系:根据上图,初始化只处理了s[0], s[1]并未处理,因此填表处理时的s下标为i-1

class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        int[] dp = new int[n+1];
        dp[0] = 1;
        if(s.charAt(0)!='0') dp[1] = 1;
        else return 0;
        for(int i = 2;i<=n;i++)
        {
            if(s.charAt(i-1)>'0'&&s.charAt(i-1)<='9')  
                dp[i] += dp[i-1];

            if((s.charAt(i-2)-'0')*10+(s.charAt(i-1)-'0')>=10&&(s.charAt(i-2)-'0')*10+(s.charAt(i-1)-'0')<=26)  
                dp[i] += dp[i-2];
        }
        return dp[n];
    }
}

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

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

相关文章

RAG拉满-上下文embedding与大模型cache

无论怎么选择RAG的切分方案&#xff0c;仍然切分不准确。 最近&#xff0c;anthropics给出了补充上下文的embedding的方案&#xff0c;RAG有了新的进展和突破。 从最基础的向量查询&#xff0c;到上下文embedding&#xff0c;再到rerank的测试准确度都有了明显的改善&#xf…

【无标题】如何在Costura.Fody生成时排除掉某些dll

有个场景需要排除掉某些dll让他不要打包到exe中,这样做,修改FodyWeavers.xml

配合工具,快速学习与体验electron增量更新

有任何问题&#xff0c;都可以私信博主&#xff0c;共同探讨学习。 正文开始 前言一、如何使用源码1.1 下载代码1.2 下载资源1.3 运行项目 二、如何使用工具2.1 打包新版本更新包2.2 创建nginx文件服务器2.3 在文件服务器保存软件更新包 三、如何测试更新3.1本地运行低版本3.2 …

九、PESocket通信

知识点&#xff1a;高并发 1、下载PESocket 地址&#xff1a;PlaneZhong/PESocket: A C# Network Library. (github.com) 2、示例代码 发过去一个Hello&#xff0c;返回一个hello 当一个客户端关闭了&#xff0c;会出现一个提示 当一个客户端开启&#xff0c;会显示已连接 3…

运放类公式计算

简介 很多运放的GAIN采用dB的方式表达放大倍数&#xff0c;然而我们有时候习惯使用电压的倍数代表运放放大关系&#xff0c;本章主要简单介绍dB与电压转换的关系。 例如某运放的放大倍数如下&#xff1a; G1G2GAIN(dB)0029.60119.110131116 以上放大倍数我们无法知道输入的信号…

有趣的在线可视化网站:探索神经网络与矩阵运算

有趣的在线可视化网站&#xff1a;探索神经网络与矩阵运算 文章目录 有趣的在线可视化网站&#xff1a;探索神经网络与矩阵运算一 TensorFlow Playground 神经网络二 Symbolab 的矩阵迹计算器三 Matrixmultiplication 可视化教学工具 本文推荐了几个非常有趣且实用的在线可视化…

sql实战解析-sum()over(partition by xx order by xx)

该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 从简单开始一步一步讲&#xff0c; 1、sum( )over( ) 对所有行进行求和 2、sum(…

静态站点生成器哪家强?

有一种方法&#xff0c;让你写好文档后&#xff0c;快速地让同事、用户和合作伙伴看到&#xff0c;这就是静态站点生成器。 静态站点生成器是一种软件&#xff0c;用于创建不需要服务器端脚本的网站。这些网站由纯HTML文件组成&#xff0c;可能还包括CSS和JavaScript来增强功…

【PhpSpreadsheet】ThinkPHP5+PhpSpreadsheet实现批量导出数据

目录 前言 一、安装 二、API使用 三、完整实例 四、效果图 前言 为什么使用PhpSpreadsheet&#xff1f; 由于PHPExcel不再维护&#xff0c;所以建议使用PhpSpreadsheet来导出exlcel&#xff0c;但是PhpSpreadsheet由于是个新的类库&#xff0c;所以只支持PHP7.1及以上的版…

如何激活Windows server服务器

步骤&#xff1a; 一、用VMware虚拟机安装了Windows server服务器之后的状态 图1-1 查看Windows server2019 系统信息 图1-2 在桌面上查看个性化&#xff0c;提示系统未激活 二、激活的步骤&#xff1a; 1.找激活工具 图1-2 寻找激活工具并准备拖拽到虚拟服务器中 2.解压…

【服务器虚拟化是什么?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

微信小程序使用MQTT连接阿里云

目录 一、新建项目和项目整体配置​ 二、MQTT 下载引入和配置连接​ 三、阿里云配置 1、创建产品及设备 2、数据进行云流转 四、创建 MQTT 连接​ 五、微信小程序配置 六、效果展示 1、微信小程序发送控制命令 2、LED台灯反馈LED状态 七、微信小程序项目完整代码 一…

不同晶圆厂的简单分析

以下是各类晶圆厂的投资情况、技术特点、应用场合、代表性公司以及建厂难度分析: 1. 先进逻辑芯片制造商: ->投资情况:台积电在美国亚利桑那州凤凰城的5nm半导体厂,三年总投资约120亿美元。 ->技术特点:使用最先进的制程技术,如5nm、3nm等,包括极紫外(EUV)光…

《太吾绘卷》风灵月影游戏辅助好不好用?《太吾绘卷》风灵月影游戏辅助功能 全解析

太吾绘卷风灵月影修改器可调整游戏多项数据&#xff0c;助力玩家轻松过关。启动游戏后&#xff0c;按数字键1开启无敌模式&#xff0c;数字键2锁定时间&#xff0c;数字键3实现物品不消耗&#xff0c;Ctrl数字键1则能获得无限银钱等功能&#xff0c;为玩家提供全方位的游戏辅助…

如何删除Maven

1.找到Maven安装路径 方法一&#xff1a; 可以直接在文件资源管理器里面选中“此电脑”然后右上角搜“apache-maven”&#xff0c;这个过程可能长达几分钟甚至更久 方法二&#xff1a; 这里推荐一个名叫“Everything”的软件&#xff0c;能够快速的查找到需要的文件 2.找到本…

登录前端笔记(二):vuex管理用户数据;跨域;axios封装;环境;请求响应拦截;权限;用户资料Vuex共享

一、Vuex登录流程之用户模块&#xff1a; 简言之&#xff1a;点击登录调用actions且得到token&#xff0c;把得到的token提交给mutations从而修改state里的数据。 原视频 &#xff08;1&#xff09;Vuex用户模块流程 组件页面里点击登录后&#xff0c;调用stores里的actions&…

罹患眼肿瘤艰难求医,爱尔眼科“眶护光明”公益助力患者解除眼疾

来自达川区管村镇高寨村的冉启珍&#xff0c;家庭人口共4人&#xff0c;家里户主丈夫吴让洪于2018年患脑梗&#xff0c;又于2021年复发脑溢血&#xff0c;致肢体二级残疾&#xff0c;患有高血压等慢性病&#xff0c;需要长期服药&#xff0c;完全丧失劳动能力&#xff0c;长期需…

开源OpenStack

1.查询HCS基于OpenStack哪个版本开发 2.九大核心组件 OpenStack可以对接FC也可以对接KVM主机&#xff1b;&#xff08;OpenStack 对接华为FusionCompute&#xff0c;一个集群对应 openstack 一台计算主机&#xff09;-引申出nova compute 2.1nova nova两个核心组件nova contro…

期刊论文投稿指南:如何利用ChatGPT精准选择合适的期刊?

知学术AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在学术论文的写作与发表过程中&#xff0c;选择合适的期刊往往是投稿成功的关键一步。面对众多期刊&#xff0c;研究者常常感到迷茫&#xff0c;不知道该如何匹配期刊与自己的研究方向。这时&#xf…

AD服务器超过180天未使用导致数据同步复制失败

问题描述 【适用版本】&#xff1a;FusionAccess 所有版本 环境在操作域站点间执行AD复制副本时出现如下错误&#xff1a;“AD不能与此服务器复制&#xff0c;因为距上一次与此服务器复制的时间已经超过了tombstone生存时间&#xff0c;此操作不能继续。”导致其他服务器、虚拟…