当前位置: 首页 > news >正文

【动态规划之斐波那契数列模型】——累加递推型动态规划

文章目录

  • 第N个泰波那契数列
  • 面试题08.01.三步问题
  • 使用最小花费爬楼梯
  • 解码问题

第N个泰波那契数列

解题思路: 泰波那契数列的第 N 项定义为前面三项之和,即 T0 = 0, T1 = 1, T2 = 1,从 T3 开始,每一项都等于前三项的和。要找到第 N 项,可以使用动态规划逐步求解每个值直到 TN。

初始化 T0 = 0, T1 = 1, T2 = 1。
使用一个数组或三个变量记录最近三项的值。
从 T3 开始,利用递推公式 Tn = T(n-1) + T(n-2) + T(n-3) 计算到第 N 项。
返回结果。
时间复杂度为 O(n),空间复杂度为 O(1)(若只保留最近三项值)。

class Solution 
{
public:int tribonacci(int n) {// 如果 n 等于 0,直接返回 0,因为 T0 = 0if(n == 0) return 0;// 如果 n 等于 1 或 2,返回 1,因为 T1 = T2 = 1if(n == 1 || n == 2) return 1;// 初始化前三项的值int a = 0, b = 1, c = 1, d = 0;// 从第 3 项开始计算到第 n 项for(int i = 3; i <= n; i++){// 当前项 d 是前面三项的和d = a + b + c;// 更新前三项的值,将 a, b, c 滚动到下一个位置a = b; // 原 b 变成新的 ab = c; // 原 c 变成新的 bc = d; // 当前项 d 变成新的 c}// 返回第 n 项的值return d;}
};
class Solution 
{
public:int tribonacci(int n) { // 特殊情况处理if(n == 0) return 0;   // 当 n 为 0 时,返回 0if(n == 1 || n == 2) return 1;  // 当 n 为 1 或 2 时,返回 1// 定义 dp 数组,dp[i] 表示第 i 个泰波那契数vector<int> dp(n + 1);// 初始化前三项dp[0] = 0;dp[1] = 1;dp[2] = 1;// 从第 3 项开始,利用递推公式逐步计算泰波那契数for(int i = 3; i <= n; i++){dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];  // 当前项等于前三项之和}// 返回第 n 项的泰波那契数return dp[n];}
};

面试题08.01.三步问题

解题思路: 在楼梯上每次可以选择走 1 步、2 步或 3 步,问走到第 n 级台阶有多少种不同的方法。这个问题可以看作一个动态规划问题。

定义 dp[i] 为到达第 i 级台阶的方法总数。
基础条件:dp[0] = 1(在起点不动算一种方法),dp[1] = 1,dp[2] = 2。
递推公式:dp[i] = dp[i-1] + dp[i-2] + dp[i-3],因为可以从前一、前二或前三个台阶到达。
从小到大依次计算 dp[i],最终得到 dp[n]。
时间复杂度为 O(n),空间复杂度也为 O(1)(只需记录前几项的值)。

class Solution 
{
public:int waysToStep(int n) {// 定义取模常量,用于防止结果过大const int MOD = 1e9 + 7;// 定义 dp 数组,dp[i] 表示到达第 i 级台阶的方法数vector<int> dp(n + 1);// 处理特殊情况if(n == 1 || n == 2) return n; // 如果 n 是 1 或 2,直接返回 nif(n == 3) return 4;           // 如果 n 是 3,直接返回 4(方法有:1+1+1, 1+2, 2+1, 3)// 初始化前三个台阶的方法数dp[1] = 1;  // 到达第 1 级台阶只有 1 种方法dp[2] = 2;  // 到达第 2 级台阶有 2 种方法:1+1 或 2dp[3] = 4;  // 到达第 3 级台阶有 4 种方法:1+1+1, 1+2, 2+1, 3// 从第 4 级台阶开始,使用递推公式计算每一级台阶的方法数for(int i = 4; i <= n; i++){// 当前台阶的方法数等于前一、前二和前三个台阶的方法数之和,并对 MOD 取模dp[i] = ((dp[i - 1] + dp[i - 2]) % MOD + dp[i - 3]) % MOD;}// 返回到达第 n 级台阶的方法数return dp[n];}
};

使用最小花费爬楼梯

解题思路: 每一步都有一个代价,从楼梯底部出发,最终要到达顶层。选择以最小代价到达顶层。

定义 dp[i] 为到达第 i 层的最小花费。
初始状态:dp[0] = cost[0],dp[1] = cost[1]。
递推公式:dp[i] = min(dp[i-1], dp[i-2]) + cost[i],即可以从前一层或前两层到达。
为了达到顶层,我们可以从 n-1 或 n-2 层爬上去,所以最终答案是 min(dp[n-1], dp[n-2])。
优化:我们可以仅用两个变量记录前两个状态值,进一步降低空间复杂度到 O(1)。

class Solution 
{
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();// 定义 dp 数组,dp[i] 表示从第 i 级台阶出发到达楼顶的最小花费vector<int> dp(n);// 初始化最后两个台阶的花费dp[n - 1] = cost[n - 1]; // 从最后一级直接到达顶层的花费就是 cost[n-1]dp[n - 2] = cost[n - 2]; // 从倒数第二级直接到达顶层的花费就是 cost[n-2]// 从倒数第三个台阶开始向前计算每一级的最小花费for(int i = n - 3; i >= 0; i--){// 当前台阶的最小花费等于当前台阶的成本加上从下一阶或下下阶出发的最小花费dp[i] = cost[i] + min(dp[i + 1], dp[i + 2]);} // 返回从第 0 或第 1 个台阶出发的较小花费,因为可以从这两级开始攀登return min(dp[0], dp[1]);}
};

解码问题

解题思路: 给定一个数字字符串,按字母表中的编码规则解码出不同的解码方式数量(如 A=1,B=2,… Z=26)。

定义 dp[i] 为长度为 i 的子字符串的解码方式数。
初始状态:dp[0] = 1(空字符串有一种解码方式,即不解码)。
递推公式:
若 s[i-1] 是一个有效的单个字符(非 0),则 dp[i] += dp[i-1]。
若 s[i-2:i] 是有效的双字符(10 到 26),则 dp[i] += dp[i-2]。
最终结果为 dp[n],即整个字符串的解码方式数。
该算法的时间复杂度为 O(n),空间复杂度也可以优化到 O(1)。

class Solution 
{
public:int numDecodings(string s) {int n = s.size();// 定义 dp 数组,dp[i] 表示长度为 i 的子字符串的解码方法总数vector<int> dp(n + 1);// 初始状态:空字符串有一种解码方法dp[0] = 1;// dp[1] 取决于第一个字符是否为 '0',如果是 '0' 则没有解码方法dp[1] = s[0] != '0';// 从第二个字符开始遍历,逐步计算解码方法数for(int i = 2; i <= n; i++){// 处理单独解码的情况,如果当前字符不为 '0',则可以单独解码if(s[i - 1] != '0') dp[i] += dp[i - 1];// 处理两个字符组合解码的情况int a = (s[i - 2] - '0') * 10 + (s[i - 1] - '0'); // 计算当前和前一个字符组合的数值if(a >= 10 && a <= 26) dp[i] += dp[i - 2];}// 返回整个字符串的解码方法总数return dp[n];}
};

相关文章:

【动态规划之斐波那契数列模型】——累加递推型动态规划

文章目录 第N个泰波那契数列面试题08.01.三步问题使用最小花费爬楼梯解码问题 第N个泰波那契数列 解题思路&#xff1a; 泰波那契数列的第 N 项定义为前面三项之和&#xff0c;即 T0 0, T1 1, T2 1&#xff0c;从 T3 开始&#xff0c;每一项都等于前三项的和。要找到第 N 项…...

5g通信系统用到的crc码

5g通信系统用到的crc码 关注 在5G通信系统中&#xff0c;CRC码&#xff08;循环冗余校验码&#xff09;扮演着关键角色&#xff0c;它通过执行多项式除法运算来检测数据在传输过程中是否发生错误。5G通信系统中采用了多种CRC码&#xff0c;每种码都有其独特的计算方法和校验特…...

Ubuntu-22.04 虚拟机安装

1. Ubuntu安装方式 1.1. 基于物理介质安装 光盘安装&#xff1a;通过将 Ubuntu 镜像刻录到光盘&#xff0c;在计算机 BIOS/UEFI 中设置光盘为第一启动项&#xff0c;然后按照安装程序的提示进行语言选择、分区、用户信息设置等操作来完成安装。这种方式需要有光盘刻录设备和空…...

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下&#xff0c;我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发八,使用SDLVSQT显示yuv文件 ,使用ffmpeg的AVFrame

一. AVFrame 核心回顾&#xff0c;uint8_t *data[AV_NUM_DATA_POINTERS] 和 int linesize[AV_NUM_DATA_POINTERS] AVFrame 存储的是解码后的数据&#xff0c;&#xff08;包括音频和视频&#xff09;例如&#xff1a;yuv数据&#xff0c;或者pcm数据&#xff0c;参考AVFrame结…...

HTML 标签属性——<a>、<img>、<form>、<input>、<table> 标签属性详解

文章目录 1. `<a>`元素属性hreftargetname2. `<img>`元素属性srcaltwidth 和 height3. `<form>`元素属性actionmethodenctype4. `<input>`元素属性typevaluenamereadonly5. `<table>`元素属性cellpaddingcellspacing小结HTML元素除了可以使用全局…...

css简写属性

一些属性&#xff0c;如 font、background、padding、border 和 margin 等属性称为简写属性。它们允许在一行中设置多个属性值&#xff0c;从而节省时间并使代码更整洁。 /* 在像 padding 和 margin 这样的 4 值简写语法中&#xff0c;数值的应用顺序是上、右、下、左&#xff…...

力扣刷题(sql)--零散知识点(2)

1.自定义分组后的分类统计问题&#xff08;某组内无数据却仍要展示&#xff09; 例题1&#xff1a; 查询每个工资类别的银行账户数量。 工资类别如下&#xff1a; "Low Salary"&#xff1a;所有工资 严格低于 20000 美元。"Average Salary"&#xff1a;…...

TCP是怎样工作的网络拥塞控制理论和算法部分记录

参考资料 https://github.com/ituring/tcp-book 流量控制、窗口控制和拥塞控制的关系 流量控制、窗口控制和拥塞控制的关系如图所示 窗口控制是上层的概念&#xff0c;核心思路是基于滑动窗口技术传输数据。而确定发送窗口大小的方法有流量控制和拥塞控制两种 流量控制&…...

CSRF初级靶场

靶场 针对DVWA么有防御 源码&#xff1a; <?phpif( isset( $_GET[ Change ] ) ) {// Get input$pass_new $_GET[ password_new ];$pass_conf $_GET[ password_conf ];// Do the passwords match?if( $pass_new $pass_conf ) {// They do!$pass_new ((isset($GLOBA…...

CSP/信奥赛C++刷题训练:经典差分例题(2):洛谷P9904 :Mieszanie kolorów

CSP/信奥赛C++刷题训练:经典差分例题(2):洛谷P9094 :Mieszanie kolorw 题目描述 题目译自 PA 2020 Runda 1 Mieszanie kolorw Byteasar 正准备给栅栏涂漆。他已经准备了 n n n 罐白色油漆,他把这些油漆排列成一排,从 1 1 1 到 n n n 编号。他想用这些油漆,但他不想…...

Java | Leetcode Java题解之第525题连续数组

题目&#xff1a; 题解&#xff1a; class Solution {public int findMaxLength(int[] nums) {int maxLength 0;Map<Integer, Integer> map new HashMap<Integer, Integer>();int counter 0;map.put(counter, -1);int n nums.length;for (int i 0; i < n;…...

YOLOv8改进 - 注意力篇 - 引入iRMB注意力机制

#YOLO# #目标检测# #计算机视觉# 一、本文介绍 作为入门性篇章&#xff0c;这里介绍了iRMB注意力在YOLOv8中的使用。包含iRMB原理分析&#xff0c;iRMB的代码、iRMB的使用方法、以及添加以后的yaml文件及运行记录。 二、iRMB原理分析 iRMB官方论文地址&#xff1a;文章 iR…...

项目学习总结

文章目录 项目学习总结项目中的vw适配vw使用 封装axios实例axios常见请求配置axios响应结构axios拦截器配置Vue Router全局前置守卫 项目学习总结 在智慧商城项目中的学习总结。 项目中的vw适配 vw 是一种长度单位&#xff0c;代表视口宽度的百分比。1vw 等于视口宽度的1%。…...

用于低成本接收机的LoRa SF11 500KHz波形检测解调算法

前一篇里&#xff0c;获取了LORAwan的物理层波形&#xff0c;并通过Octave查看了它的瞬时频率。LoRa是私有协议&#xff0c;网上已经有了很不错的开源的实现&#xff0c;如&#xff1a; S2_LoRa通信实验 LoRaPhy 以及GNU-Radio的Lora模块、LimeSDR的Lora实现。当我试图修改上…...

WEB防护

WEB防护的范围比较广&#xff0c;主要是指针对web安全而做的各种防御措施&#xff0c; 包含应对xss、csrf等漏洞攻击的应对方式。 Web防护是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品&#xff0c; 主要用于防御针对网络应用层的攻击&#xff0…...

使用Jest进行JavaScript单元测试

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jest进行JavaScript单元测试 引言 Jest 简介 安装 Jest 创建基本配置 编写测试用例 运行测试 快照测试 模拟函数 代码覆盖率…...

网络安全法详细介绍——爬虫教程

目录 [TOC](目录)一、网络安全法详细介绍1. 网络安全法的主要条款与作用2. 网络安全法与爬虫的关系3. 合法使用爬虫的指南 二、爬虫的详细教程1. 准备环境与安装工具2. 使用requests库发送请求3. 解析HTML内容4. 使用robots.txt规范爬虫行为5. 设置请求间隔6. 数据清洗与存储 三…...

PCB什么情况该敷铜,什么情况不该敷铜!

更多电路设计&#xff0c;PCB设计分享及分析&#xff0c;可关注本人微信公众号“核桃设计分享”&#xff01; 这个是老生常谈的问题了&#xff0c;可私底下还是有很多小伙伴问核桃这个问题&#xff0c;所以今天就好好聊一聊这个话题。 先说结论&#xff1a;PCB不是什么时候都可…...

标准化的企业级信息管理系统信息中心必备PHP低代码平台

谈谈企业级信息管理系统&#xff01; 1. 标准化的企业级信息管理系统是信息中心必备&#xff0c;这才是集团该用的信息化管理系统。其有个很大特点是便于开发&#xff0c;能服务于企业技术中心&#xff0c;为其提供强大工具能力&#xff0c;在工具能力架构下通过流程、表单、报…...

Rust 力扣 - 1984. 学生分数的最小差值

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 原数组 nums 排序&#xff0c;遍历nums中下标为[0, nums.len() - k]的学生分数 假设当前遍历的下标为i则&#xff0c;以 i 下标为最小值的学生分数的最小差值为nums[i k - 1] - nums[i] 取最小差值的最小值即…...

【098】基于SpringBoot+Vue实现的垃圾分类系统

系统介绍 视频演示 基于SpringBootVue实现的垃圾分类系统 基于SpringBootVue实现的垃圾分类系统设计了三种角色、分别是管理员、垃圾分类管理员、用户&#xff0c;实现了个人中心、用户管理、垃圾分类管理员管理、垃圾分类管理、垃圾类型管理、垃圾图谱管理、系统管理等功能 …...

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列

STM32CUBEIDE FreeRTOS操作教程&#xff08;八&#xff09;&#xff1a;queues多队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#…...

SIGNAL TAP使用记录

一、首先编译工程 二、打开signal tap&#xff0c;并设置抓取时钟以及采样深度 二、点击set up&#xff0c;然后双击空白处&#xff0c;会弹出右侧窗口&#xff0c;点击filter选择pre_synthesis&#xff0c;这里选择综合前的信号观测&#xff0c;要确保左侧窗口内的信号是黑色…...

基于vue3和elementPlus的el-tree组件,实现树结构穿梭框,支持数据回显和懒加载

一、功能 功能描述 数据双向穿梭&#xff1a;支持从左侧向右侧转移数据&#xff0c;以及从右侧向左侧转移数据。懒加载支持&#xff1a;支持懒加载数据&#xff0c;适用于大数据量的情况。多种展示形式&#xff1a;右侧列表支持以树形结构或列表形式展示。全选与反选&#xf…...

彻底理解链表(LinkedList)结构

目录 比较操作结构封装单向链表实现面试题 循环链表实现 双向链表实现 链表&#xff08;Linked List&#xff09;是一种线性数据结构&#xff0c;由一组节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a;数据域&#xff08;存储数据&#xff…...

TON 区块链开发的深入概述#TON链开发#DAPP开发#交易平台#NFT#Gamefi链游

区块链开发领域发展迅速&#xff0c;各种平台为开发人员提供不同的生态系统。其中一个更有趣且越来越相关的区块链是TON&#xff08;开放网络&#xff09;区块链。TON 区块链最初由 Telegram 构思&#xff0c;旨在提供快速、安全且可扩展的去中心化应用程序 (dApp)。凭借其独特…...

Hive专栏概述

Hive专栏概述 Hive“出身名门”&#xff0c;是最初由Facebook公司开发的数据仓库工具。它简单且容易上手&#xff0c;是深入学习Hadoop技术的一个很好的切入点。专栏内容包括&#xff1a;Hive的安装和配置&#xff0c;其核心组件和架构&#xff0c;Hive数据操作语言&#xff0c…...

鼠标悬停后出现小提示框实现方法

大家在网页上会经常看到某些图标或文字&#xff0c;当鼠标悬停后会在四周某个位置出现一个简短的文字提示&#xff0c;这种提示分为两种&#xff0c;一种是提示固定的文字&#xff0c;例如放在qq图标上&#xff0c;会显示固定的文字“QQ”&#xff1b;第二种是显示鼠标所在标签…...

计算机视觉常用数据集Foggy Cityscapes的介绍、下载、转为YOLO格式进行训练

我在寻找Foggy Cityscapes数据集的时候花了一番功夫&#xff0c;因为官网下载需要用公司或学校邮箱邮箱注册账号&#xff0c;等待审核通过后才能进行下载数据集。并且一开始我也并不了解Foggy Cityscapes的格式和内容是什么样的&#xff0c;现在我弄明白后写下这篇文章&#xf…...