[Algorithm][动态规划][子序列问题][最长定差子序列][最长的斐波那契子序列的长度]详细讲解

本文主要是介绍[Algorithm][动态规划][子序列问题][最长定差子序列][最长的斐波那契子序列的长度]详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.最长定差子序列
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.最长的斐波那契子序列的长度
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.最长定差子序列

1.题目链接

  • 最长定差子序列

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • i位置元素为结尾的所有子序列中,最长的等差子序列的长度
    • 推导状态转移方程
      请添加图片描述

    • 优化

      • 将元素 + dp[j]的值,绑定存放进哈希表中
        • 这样就不用每次都从前向后遍历原数组找值了
      • 直接在哈希表中,做动态规划
    • 初始化:hash[arr[0]] = 1

    • 确定填表顺序:从左往右

    • 确定返回值:整个dp表里的最大值


3.代码实现

int longestSubsequence(vector<int>& arr, int difference) 
{unordered_map<int, int> hash; // <arr[i], dp[i]>hash[arr[0]] = 1;int ret = 0;for(int i = 1; i < arr.size(); i++){// 1.如果arr[j]不存在,那么arr[i]就会被初始化为1// 2.如果出现重复的值,那么后面出现的值会覆盖掉前面的值hash[arr[i]] = hash[arr[i] - difference] + 1; ret = max(ret, hash[arr[i]]);}return ret;
}

2.最长的斐波那契子序列的长度

1.题目链接

  • 最长的斐波那契子序列的长度

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i]的含义

      • dp[i]:以i位置元素为结尾的所有的子序列中,最长的斐波那契子序列的长度 -> 无法正确表示状态
        • 因为虽然可以找到i前一个值,但是却无法得知此时它前一个数是什么,现在的规模到哪一步了
      • dp[i][j]:以i位置以及j位置的元素为结尾的所有的子序列中,最长的斐波那契子序列的长度(i < j)
    • 推导状态转移方程
      请添加图片描述

    • 优化:将数组中所有元素与它们的下标绑定,存在哈希表中,这样有利于提升查找效率

    • 初始化:vector<vector<int>> dp(n, vector<int>(n, 2))

    • 确定填表顺序:从上往下

    • 确定返回值:dp表里的最大值:ret < 3 ? 0 : ret


3.代码实现

int lenLongestFibSubseq(vector<int>& arr) 
{int n = arr.size();// 优化unordered_map<int, int> hash; // <arr[i], i>for(int i = 0; i < n; i++){hash[arr[i]] = i;}vector<vector<int>> dp(n, vector<int>(n, 2));int ret = 2;for(int j = 2; j < n; j++) // 固定第一个位置{for(int i = 1; i < j; i++) // 固定第二个位置{int a = arr[j] - arr[i];if(a < arr[i] && hash.count(a)){dp[i][j] = dp[hash[a]][i] + 1;ret = max(ret, dp[i][j]);}}}return ret < 3 ? 0 : ret;
}

这篇关于[Algorithm][动态规划][子序列问题][最长定差子序列][最长的斐波那契子序列的长度]详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023268

相关文章

CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比

《CSS中的Static、Relative、Absolute、Fixed、Sticky的应用与详细对比》CSS中的position属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布... css 中的 position 属性用于控制元素的定位方式,不同的定位方式会影响元素在页面中的布局和层叠关

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。