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

在这里插入图片描述

文章目录

  • 声明
  • 动态规划介绍
  • 1137.第N个泰波那契数
    • 题目描述
    • 分析
    • 代码
  • 面试题 08.01. 三步问题
    • 题目描述
    • 分析
    • 代码
  • 746.使用最小花费爬楼梯
    • 题目描述
    • 分析
    • 代码
  • 91.解码⽅法
    • 题目描述
    • 分析
    • 代码

声明

本篇博客为动态规的基础篇,从零开始学习动态规划,如有错误,请指正。

动态规划介绍

动态规划简称DP,核心思想是将原问题分解为相互重叠的子问题,通过解决这些子问题来解决原问题。在解决每个子问题后,将其解存储起来,避免重复计算,以提高效率。

动态规划通常适用于以下类型的问题:

  • 最优化问题:如最长路径、最小代价等问题
  • 组合优化问题:如背包问题、切割问题等
  • 路径规划问题:如最短路径、最小生成树等
  • 序列匹配问题:如字符串匹配、子序列匹配等

通常情况下,使用动态规划来解决问题需要满足以下几个条件:

  1. 最优子结构:问题的最优解包含了其子问题的最优解。换句话说,通过求解子问题可以得到整体问题的最优解。

  2. 重叠子问题:问题可以分解为若干个相互重叠的子问题,这些子问题在解决过程中会被多次重复求解。

  3. 状态转移方程:问题的解可以通过状态转移的方式进行求解,即通过子问题的解推导出原问题的解。

解题步骤:

  1. 列出状态表示,dp表里的某个值代表的含义,需要通过大量做题来总结
  2. 列出状态方程,即dp[i]=?
  3. 初始化,保证填表的时候不越界
  4. 确定填表顺序,为了填写当前状态的时候前面的状态已经确定过了
  5. 返回值,题目要求+状态标识

实际上,光听这些理论的解题步骤,在做题的时候还是不会,接下来,将会从基础篇入手,来学动态规划算法。

1137.第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
输出:1389537

分析

  1. 状态表⽰:
    这道题可以「根据题⽬的要求」直接定义出状态表⽰:
    dp[i]表⽰:第i个泰波那契数的值。
  2. 状态转移⽅程:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
  3. 初始化:
    从我们的递推公式可以看出, dp[i]i = 0 以及i = 1的时候是没有办法进⾏推导的,因为dp[-2]dp[-1]不是⼀个有效的数据。因此我们需要在填表之前,将0, 1, 2位置的值初始化。题⽬中已经告诉我们dp[0] = 0,dp[1] = dp[2] = 1
  4. 填表顺序:从左往右
  5. 返回dp[n]的值

代码

class Solution {
    int dp[40];
public:
    int tribonacci(int n) {
        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];     //返回值
    }
};

面试题 08.01. 三步问题

面试题 08.01. 三步问题

题目描述

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

示例2:
输入:n = 5
输出:13

分析

  1. 状态方程表示:dp[i]表示到达第i个台阶时,有多少种方法

  2. 状态转移方程:dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
    在这里插入图片描述
    可以从分别从i-1i-2i-3到达i

  3. 初始化
    从我们的递推公式可以看出, dp[i] i = 0, i = 1 以及i = 2 的时候是没有办法进⾏推导的,因为dp[-3]dp[-2]dp[-1]不是⼀个有效的数据。
    因此我们需要在填表之前,将1, 2, 3位置的值初始化。
    根据题意, dp[1] = 1, dp[2] = 2, dp[3] = 4

  4. 填表顺序
    从左往右

  5. 返回值
    返回dp[n]的值

代码

class Solution {
public:
    int MOD=1e9+7;
    int waysToStep(int n) {
        if(n==1||n==2) return n;  //处理一下边界情况
        if(n==3) return 4;
        vector<int> dp(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];
    }
};

746.使用最小花费爬楼梯

746.使⽤最⼩花费爬楼梯

题目描述

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。

  • 支付 15 ,向上爬两个台阶,到达楼梯顶部。
    总花费为 15 。

示例 2:
输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6

分析

  1. 状态方程表示:dp[i]表示从i位置出发,到达楼顶的最小花费1
  2. 状态转移方程:
    ▪ ⽀付cost[i] ,往后⾛⼀步,接下来从i + 1的位置出发到终点: dp[i + 1] + cost[i]
    ▪ ⽀付cost[i] ,往后⾛两步,接下来从i + 2的位置出发到终点: dp[i + 2] + cost[i]
  3. 初始化:为了保证填表的时候不越界,我们需要初始化最后两个位置的值,结合状态表⽰易得: dp[n - 1] = cost[n - 1], dp[n - 2] = cost[n - 2]
  4. 填表顺序:从右到左
  5. 返回值:dp[1]dp[0]的最小值

代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        vector<int> dp(n+1,0);
        dp[n-1]=cost[n-1],dp[n-2]=cost[n-2];
        for(int i=n-3;i>=0;i--)
        {
            dp[i]=cost[i]+min(dp[i+1],dp[i+2]);
        }
        return min(dp[1],dp[0]);
    }
};

91.解码⽅法

91.解码⽅法

题目描述

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

‘A’ -> “1”
‘B’ -> “2”

‘Z’ -> “26”
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:

“AAJF” ,将消息分组为 (1 1 10 6)
“KJF” ,将消息分组为 (11 10 6)
注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

示例 1:
输入:s = “12”
输出:2
解释:它可以解码为 “AB”(1 2)或者 “L”(12)。

示例 2:
输入:s = “226”
输出:3
解释:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6) 。

示例 3:
输入:s = “06”
输出:0
解释:“06” 无法映射到 “F” ,因为存在前导零(“6” 和 “06” 并不等价)。

分析

  1. 状态表示:dp[i]表示以i位置结尾时,解码方法的总数
  2. 可分为两种情况:
    s[i]单独解码的时候:如果解码成功dp[i]+=dp[i-1];如果解码失败就是0
    s[i-1]s[i]结合解码时:如果解码成功dp[i]+=dp[i-2];如果解码失败就是0
  3. 填表顺序:从左往右
  4. 返回值:返回最后一个值即可dp[n-1]

代码

class Solution {
public:
    int numDecodings(string s) {
        int n=s.size();
        vector<int> dp(n,0);
        dp[0]=s[0]!='0';
        if(n==1) return dp[0];
        if(s[0]!='0'&&s[1]!='0') dp[1]+=1;
        int t=(s[0]-'0')*10+s[1]-'0';
        if(t>=10&&t<=26) dp[1]+=1;
        
        for(int i=2;i<n;i++)
        {
            if(s[i]!='0') dp[i]+=dp[i-1];
            int t=(s[i-1]-'0')*10+s[i]-'0';
            if(t>=10&&t<=26) dp[i]+=dp[i-2];
        }
        return dp[n-1];
    }
};

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB quiver矢量图 设置colorbar

给三维矢量图按照不同高度设置箭头颜色 figure clf X surfaceuz(:,1); Y surfaceuz(:,2); Z surfaceuz(:,3); hold onzcolor jet; % qquiver3(X,Y,Z,X,Y,W) for i 1:length(surfaceuz)quiver3(X(i),Y(i),Z(i),X(i),Y(i), Z(i),...Color,zcolor(floor((Z(i) - -0.1) * 2…

408数据结构-图的应用3-有向无环图、拓扑排序 自学知识点整理

前置知识&#xff1a;表达式&#xff0c;图的遍历 有向无环图描述表达式 有向无环图&#xff1a;若一个有向图中不存在环&#xff0c;则称为有向无环图&#xff0c;简称 D A G DAG DAG图 。 &#xff08;图片来自王道考研408数据结构2025&#xff09; 由王道考研-咸鱼学长的讲…

深圳晶彩智能JC3636W518C开箱实现电脑副屏功能

深圳晶彩智能发布了JC3636W518C 这是一款中国制造的&#xff0c;铝合金外壳&#xff0c;价格非常震撼的开发板。原创是billbill的up播主萨纳兰的黄昏设计的ESP32太极小派&#xff0c;由深圳晶彩智能批量生产。 该款 LCD 模块采用 ESP32-S3R8 芯片作为主控,该主控是双核 MCU&…

Vulnhub:DC-1

1.环境搭建 靶机下载地址 将下载的靶机导入到Oracle VM VirtualBox中&#xff0c;设置仅主机模式&#xff0c;使用和kali相同的网卡 2.渗透过程 使用nmap工具进行主机发现扫描 nmap -sn 192.168.56.0/24 发现靶机ip地址&#xff0c;使用nmap工具进行靶机端口扫描 nmap -sS…

一文说透Springboot单元测试

你好&#xff0c;我是柳岸花开。 一、单元测试说明 1 单元测试的优点与基本原则 一个好的单元测试应该具备以下FIRST 原则和AIR原则中的任何一条&#xff1a; 单元测试的FIRST 规则 Fast 快速原则&#xff0c;测试的速度要比较快&#xff0c; Independent 独立原则&#xff0c;…

Qt 多窗体、复用窗口的使用

1.继承自QWidge的窗口的呈现&#xff0c;作为tabPage呈现&#xff0c;作为独立窗口呈现 2.继承自QMainWindow的窗口的呈现&#xff0c;作为abPage呈现&#xff0c;作为独立窗口呈现 1. 继承自QWidge的窗口的呈现 1.1 作为tabPage呈现 void MutiWindowExample::on_actWidgetI…

AI绘画入门实践|Midjourney 提示词的使用技巧

提示词长短 尽可能做到简洁明了。 提示词很短 MJ 出图的随机性更高&#xff0c;创造的内容更有想象力&#xff0c;更适合创意发散的图像生成。 a dog 提示词很长 MJ 出图会更加精准&#xff0c;但描述太过详细&#xff0c;有可能出现AI理解不到位的情况。 越到后面的提示词&…

风险评估:IIS的安全配置,IIS安全基线检查加固

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

Java面试八股之Redis集群Cluster

Redis集群Cluster Redis Cluster是一种基于数据分片&#xff08;Sharding&#xff09;的分布式缓存和存储系统&#xff0c;它实现了数据的水平扩展、高可用性和自动故障转移。以下是对Redis Cluster模式详细实现流程的描述&#xff1a; 1. 初始化与配置 部署节点&#xff1a…

flutter 手写 TabBar

前言&#xff1a; 这几天在使用 flutter TabBar 的时候 我们的设计给我提了一个需求&#xff1a; 如下 Tabbar 第一个元素 左对齐&#xff0c;试了下TabBar 的配置&#xff0c;无法实现这个需求&#xff0c;他的 配置是针对所有元素的。而且 这个 TabBar 下面的 滑块在移动的时…

产品经理-产品经理会在项目中遇到的几个问题(16)

项目中遇到了需求变更怎么办&#xff1f; 首先要弄清楚需求变更的原因是什么。如果是因为在迭代的过程中更好地理解了用户需求 进而产生了更好的需求则完全是正常的。如果是因为老板的需求 那就需要和老板沟通清楚&#xff0c;并且确保自己能理解老板的需求&#xff0c;而且这个…

软件测试——测试用例

工作职责&#xff1a; 1.负责产品系统测试&#xff0c;包括功能测试、性能测试、稳定性测试、用户场景测试、可靠性测试等。 2.负责测试相关文档的编写&#xff0c;包括测试计划、测试用例、测试报告等。 3.负责自动化测试框架、用例的维护。 岗位要求&#xff1a; 1.熟练…

800块,我从淘宝上买AGV……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》人俱乐部 从淘宝上打算够购买一台AGV小车&#xff0c;上去一搜&#xff0c;嘿&#xff0c;你别说&#xff0c;还真有。便宜的才200块钱。 很兴奋把…

17-8 向量数据库之野望8 - 7 个主流向量数据库

​​​​​​ 在快速发展的人工智能 (AI)、机器学习 (ML) 和数据工程领域,对高效数据存储和检索系统的需求至关重要。矢量数据库已成为管理这些技术通常依赖的复杂高维数据的关键解决方案。在这里,我们探讨了每个 AI/ML/数据工程师都应该熟悉的七个矢量数据库,重点介绍了它们…

【Linux】01.Linux 的常见指令

1. ls 指令 语法&#xff1a;ls [选项] [目录名或文件名] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 常用选项&#xff1a; -a&#xff1a;列出当前目录下的所有文件&#xff0c;包含隐藏文件…

JavaSE学习笔记第三弹之异常抛出

今天我们继续来学习JavaSE相关的知识&#xff0c;希望与大家共同努力。 目录 异常 什么是异常 运行时异常 编译时异常 ​编辑 为什么需要异常处理机制 错误 异常的处理与抛出 异常处理 异常抛出 自定义异常 结语 异常 什么是异常 Java中异常是一种在程序运行时发…

Java二十三种设计模式-原型模式(5/23)

Java中的原型模式&#xff1a;深入解析与应用实践 引言 原型模式&#xff08;Prototype Pattern&#xff09;是一种创建型设计模式&#xff0c;它使用一个已有的对象作为原型&#xff0c;通过复制这个原型来创建新的实例。这种模式适用于对象的创建成本较高&#xff0c;或者对…

BL201分布式I/O耦合器连接Profinet网络

钡铼技术的BL201分布式I/O耦合器是一个用于Profinet网络的设备&#xff0c;用于连接远程输入/输出&#xff08;I/O&#xff09;设备到控制系统&#xff0c;如可编程逻辑控制器&#xff08;PLC&#xff09;&#xff0c;能够实现分布式的I/O连接和通信。 它支持标准Profinet IO …

Qt实现一个简单的视频播放器

目录 1 工程配置 1.1 创建新工程 1.2 ui界面配置 1.3 .pro配置 2 代码 2.1 main.c代码 2.2 widget.c 2.3 widget.h 本文主要记述了如何使用Qt编写一个简单的视频播放器&#xff0c;整个示例采用Qt自带组件就可以完成。可以实现视频的播放和暂停等功能。 1 工程配置 1.…

都说油车不行了,外资两款经典油车降价起量,与电动车展开决战

6月份的轿车销量数据出来了&#xff0c;数据显示电动汽车并没稳赢&#xff0c;燃油车终于发力了&#xff0c;反过来围剿电动汽车了&#xff0c;显示出消费者并非说不买油车&#xff0c;而是看价格&#xff0c;价格合适&#xff0c;消费者仍然会选择油车。 6月份的数据显示之前销…