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

news2024/11/15 13:40:54

在这里插入图片描述

文章目录

  • 声明
  • 动态规划介绍
  • 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.coloradmin.cn/o/1928750.html

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

相关文章

14、Python之super star:一颗星、两颗星,满天都是小星星

引言 关于Python系列的文章&#xff0c;已经通过两篇文章&#xff0c;介绍了Python中关于函数的简单使用&#xff0c;包括为什么要使用函数&#xff0c;以及函数中带默认值参数的使用注意事项。 之后&#xff0c;岔开函数的主题&#xff0c;通过几篇番外篇&#xff0c;重点谈…

PHP恋爱话术微信小程序系统源码

&#x1f496;恋爱高手的秘密武器&#xff01;恋爱话术微信小程序&#xff0c;让情话信手拈来✨ &#x1f4ad;【开场白&#xff1a;恋爱路上的甜蜜助手】&#x1f4ad; 还在为跟心仪的TA聊天时找不到话题而尴尬&#xff1f;或是担心自己说的每句话都显得那么“直男/女”&…

YOLOv8改进 | 检测头 | 融合渐进特征金字塔的检测头【AFPN3】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

文件安全传输系统,如何保障信创环境下数据的安全传输?

文件安全传输系统是一套旨在保护数据在传输过程中的安全性和完整性的技术或解决方案。通常包括以下几个关键组件&#xff1a; 加密&#xff1a;使用强加密算法来确保文件在传输过程中不被未授权访问。 身份验证&#xff1a;确保只有授权用户才能访问或传输文件。 完整性校验…

数据库管理-第220期 Oracle的高可用-03(20240715)

数据库管理220期 2024-07-15 数据库管理-第220期 Oracle的高可用-03&#xff08;20240715&#xff09;1 AC/TAC2 配置Service3 用户权限4 端口开放总结 数据库管理-第220期 Oracle的高可用-03&#xff08;20240715&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文…

量化发展历史简述,QMT/PTrade+恒生UFT、LDP极速柜台适用哪些情形?

量化发展简述 1.2004年萌发阶段&#xff1a;策略局限在量化择时&#xff0c;量化选股等&#xff1b; 光大保德信量化核 心基金 上投摩根阿尔法基 金 金融危机&#xff0c;海归引入。 2.2010量化元年&#xff1a;中低频交易为主&#xff0c;主要依靠套利、对冲、多因子策略等…

****react的antdesign 下拉组件ProFormSelect编辑首次不回显问题

1、使用valueEnum无法自动回显 2、要使用options会自动回显

AutoMQ 社区双周精选第十二期(2024.06.29~2024.07.12)

本期概要 欢迎来到 AutoMQ 第十一期双周精选&#xff01;在过去两周里&#xff0c;主干动态方面&#xff0c;AutoMQ 跟进了 Apache Kafka 3.4.x BUG 修复&#xff0c;并进行了CPU & GC 性能优化&#xff0c;另外&#xff0c;AutoBalancing 的 Reporter 和 Retriever 也将支…

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

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

51单片机5(GPIO简介)

一、序言&#xff1a;不论学习什么单片机&#xff0c;最简单的外设莫过于I口的高低电平的操作&#xff0c;接下来&#xff0c;我们将给大家介绍一下如何在创建好的工程模板上面&#xff0c;通过控制51单片机的GPIO来使我们的开发板上的LED来点亮。 二、51单片机GPIO介绍&#…

实验二:图像灰度修正

目录 一、实验目的 二、实验原理 三、实验内容 四、源程序和结果 源程序(python): 结果: 五、结果分析 一、实验目的 掌握常用的图像灰度级修正方法,包括图象的线性和非线性灰度点运算和直方图均衡化法,加深对灰度直方图的理解。掌握对比度增强、直方图增强的原理,…

C++相关概念和易错语法(21)(虚函数、协变、析构函数的重写)

多态的核心是虚函数&#xff0c;本文从虚函数出发&#xff0c;根据原理慢慢推进得到结论&#xff0c;进而理解多态 1.虚函数 先看一下下面的代码&#xff0c;想想什么导致了这个结果 #include <iostream> using namespace std;class A { public:virtual void test(){co…

书生实战营-LLM实战笔记

训练营非常好&#xff0c;有个github上的tutorial Tutorial/docs/L0/Linux/readme.md at camp3 InternLM/Tutorial GitHub 第1关卡 linux 的基础知识 https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Linux/readme.md#linuxinternstudio-%E5%85%B3%E5%8D%A1 非…

AIGC笔记--基于Stable Diffusion实现图片的inpainting

1--完整代码 SD_Inpainting 2--简单代码 import PIL import torch import numpy as np from PIL import Image from tqdm import tqdm import torchvision from diffusers import AutoencoderKL, UNet2DConditionModel, DDIMScheduler from transformers import CLIPTextMod…

【全面介绍Pip换源】

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

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

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

【数据结构】高效解决连通性问题的并查集详解及Python实现

文章目录 1. 并查集&#xff1a;一种高效的数据结构2. 并查集的基本操作与优化2.1 初始化2.2 查找操作与路径压缩2.3 合并操作与按秩合并 3. 并查集的应用3.1 判断连通性3.2 计算连通分量 4. 并查集的实际案例4.1 图的连通性问题4.2 网络连接问题 5. 并查集的优缺点5.1 优点5.2…

哪些网站是获取独立站外链的最佳选择?

想要为独立站获取外链&#xff0c;有几个地方可以考虑&#xff0c;首先自然是最有效的博客和文章投稿网站&#xff0c;找那些与你的行业相关的博客和内容平台&#xff0c;撰写高质量的文章&#xff0c;里面自然地嵌入你的链接。这是最有价值的外链 然后不分其他&#xff0c;效…

ESP32-S3多模态交互方案在线AI语音设备应用,启明云端乐鑫代理商

随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;嵌入式设备正逐渐变得智能化&#xff0c;让我们的家庭生活变得更加智能化和个性化。 随着大型语言模型的不断进步和优化&#xff0c;AI语音机器人设备能够实现更加智能、…

超越 Transformer开启高效开放语言模型的新篇章

在人工智能快速发展的今天&#xff0c;对于高效且性能卓越的语言模型的追求&#xff0c;促使谷歌DeepMind团队开发出了RecurrentGemma这一突破性模型。这款新型模型在论文《RecurrentGemma&#xff1a;超越Transformers的高效开放语言模型》中得到了详细介绍&#xff0c;它通过…