【动态规划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.mzph.cn/pingmian/47118.shtml

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

相关文章

AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理

AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理 一、简单介绍 二、构建问答系统 三、评估并改进问答pipeline 1…

[k8s源码]4.informer

Informer 是 client-go 库中的一个核心组件,它提供了一种高效的方式来监视 Kubernetes 集群中资源的变化。Informer 通过 Watch 机制与 API Server 建立长连接&#xff0c;初次同步时会获取资源的完整列表&#xff0c;之后只接收增量更新,大大减少了网络流量。 使用informer可…

Java常用排序算法

算法复杂度 详解Java常用排序算法&#xff08;10种&#xff0c;含演示动画&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09; arr[0] 与 arr[1]比较&#xff0c;如果前面元素大就交换&#xff0c;如果后边元素大就不交换。然后依次arr[1]与arr[2]比较&#xff0c;第…

可视化工具选择指南:助力企业数字化转型和新质生产力发展

随着信息技术的快速发展和新质生产力概念的兴起&#xff0c;可视化工具在各个行业中的作用日益凸显。这些工具不仅能够帮助用户更直观地理解和分析数据&#xff0c;还能提升团队的协作效率和决策质量。 在当今数字化转型迅速发展的背景下&#xff0c;新质生产力的概念正在成为…

SpringBoot使用开发环境的application.properties

在Spring Boot项目中&#xff0c;application.properties 或 application.yml 文件是用于配置应用程序外部属性的重要文件。这些文件允许定制你的应用&#xff0c;而无需更改代码。根据不同的运行环境&#xff0c;可以通过创建以application-{profile}.properties格式命名的文件…

python-区间内的真素数(赛氪OJ)

[题目描述] 找出正整数 M 和 N 之间&#xff08;N 不小于 M&#xff09;的所有真素数。真素数的定义&#xff1a;如果一个正整数 P 为素数&#xff0c;且其反序也为素数&#xff0c;那么 P 就为真素数。 例如&#xff0c;11&#xff0c;13 均为真素数&#xff0c;因为 11 的反序…

利用Amazon Rekognition Face Liveness进行人脸活体检测的实践与探索

在人工智能、机器学习技术日渐普及的当下&#xff0c;出海企业都希望能够加快利用人工智能、机器学习技术&#xff0c;从而打造智能产品及其增值服务、为各地区提供本地化和个性化的服务体验及实现自身业务流程智能化。九河云将介绍人脸活体检测解决方案&#xff0c;亚马逊云科…

录频软件大盘点,哪款是你的最爱?

随着网络技术的飞速发展&#xff0c;人们对于录频软件的需求越来越强烈。无论是教育工作者、学生、游戏玩家还是商务人士&#xff0c;一款合适的录频软件都可以为他们提供便利。本文将介绍3款主流的录频软件&#xff0c;以帮助用户了解它们的特点、功能以及操作方法。 录频软件…

在Centos上安装MySQL

目录 在Centos上安装MySQL1.确认当前的系统版本2.添加 MySQL Yum 源2.1访问MySQL开发者专区2.2根据当前系统选择对应的发布包2.3补充 3.MySQL的历史发行版本4.安装发布包5.安装MySQL5.1启动MySQL服务器5.2查看服务器状态5.3开机自启动5.4 登入MySQL5.5修改密码 在Centos上安装M…

Spring Data Redis + Redis数据缓存学习笔记

文章目录 1 Redis 入门1.1 简介1.2 Redis服务启动与停止&#xff08;Windows&#xff09;1.2.1 服务启动命令1.2.2 客户端连接命令1.2.3 修改Redis配置文件1.2.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常用数据类型介绍 3. Redis常用命令3.1 字符串操作命令3.2 哈希操作…

Docker-Nvidia(NVIDIA Container Toolkit)

安装NVIDIA Container Toolkit工具&#xff0c;支持docker使用GPU 目录 1.NVIDIA Container Toolkit 安装1.1 nvidia-docker安装1.2 验证1.2.1 验证安装1.2.2 额外补充 1.NVIDIA Container Toolkit 安装 1.1 nvidia-docker安装 NVIDIA/nvidia-docker Installing the NVIDIA …

SQL Server Query Store Settings (查询存储设置)

参考&#xff1a;Query Store Settings - Erin Stellato 在 SQL Server 2017 中&#xff0c;有九 (9) 个设置与查询存储相关。虽然这些设置记录在sys.database_query_store_options中&#xff0c;但我经常被问到每个设置的值“应该”是多少。我在下面列出了每个设置&am…

AI数字人直播源码解析:灰豚私有化部署背后的技术分析

随着AI数字人技术的应用潜力不断显现&#xff0c;与AI数字人相关的多个项目逐渐成为创业者们的重点关注对象&#xff0c;作为当前AI数字人典型应用场景之一的数字人直播意向人数更是屡创新高&#xff0c;AI数字人直播源码部署的热度也因此不断飙升&#xff0c;与各大数字人源码…

Centos7 安装私有 Gitlab

在 CentOS 7上&#xff0c;下面的命令也会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问。这是一个可选步骤&#xff0c;如果您打算仅从本地网络访问极狐GitLab&#xff0c;则可以跳过它。 sudo yum install -y curl policycoreutils-python openssh-server perl sudo systemct…

昇思25天学习打卡营第20天|应用实践之RNN实现情感分类

基本介绍 今天的应用实践是RNN实现情感分类&#xff0c;情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。RNN是一种循环神经网络&#xff0c;接收序列数据作为输入。模型训练所采用的数据集是IMDB影评数据集&#xff0c;数据集包含Positive和Negative两类。由…

数据库基础-进阶

数据库管理&#xff1a; *sql语句 数据库用来增删改查的语句 *** 备份 数据库的数据进行备份 * 主从复制&#xff0c;读写分离&#xff0c;高可用 原理 数据库的概念和相关的语法和规范&#xff1a; 数据库&#xff1a;组织&#xff0c;存储&#xff0c;管理数据的仓库。 数据…

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在类的层次结构中进行安全的向上转换&#xff08;从派生类到基类&#xff09;或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换&#xff08;即从派生…

使用phpMyAdmin操作MYSQL(四)

一. 学会phpMyAdmin&#xff1f; phpMyAdminhttp://water.ve-techsz.cn/phpmyadmin/ 虽然我我们可以用命令行操作数据库&#xff0c;但这样难免没有那么直观&#xff0c;方便。所以接下来我们使用phpMyAdmin来操作MySQL&#xff0c;phpMyAdmin是众多MySQL图形化管理工具中使用…

编程从零基础到进阶(更新中)

题目描述 依旧是输入三个整数&#xff0c;要求按照占8个字符的宽度&#xff0c;并且靠左对齐输出 输入格式 一行三个整数&#xff0c;空格分开 输出格式 输出它们按格式输出的效果&#xff0c;占一行 样例输入 123456789 -1 10 样例输出 123456789-1 10 #include "stdio.…

2024年7月20日(星期六)骑行支里山

2024年7月20日 (星期六&#xff09;骑行支里山&#xff0c;早8:00到8:30&#xff0c;大观公园门口集合&#xff0c;9:00准时出发【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门口集合 &#xff0c;家住东&#xff0c;南&#xff0c;北…