[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

相关文章

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu