动态规划-子序列问题——LCR 093.最长的斐波那契子序列的长度

news/2024/10/29 6:56:25/

1.题目解析

题目来源: LCR 093.最长的斐波那契子序列——力扣

测试用例 

2.算法原理

1.状态表示

由题目可知斐波那契数列至少需要三个数,所以以往的一维dp表显然无法完成状态的表示,所以需要二维的dp表来表示,这里首先表示斐波那契数列子序列的后两位数字

dp[i][j]:以第i个位置与第j个位置为结尾的斐波那契子序列的最长长度(i<j)

2.状态转移方程

由前面的状态表示我们知道需要找到斐波那契子序列就要找到最后两个数的前一个数才能构成长度至少为3的子序列,为了不逐个遍历我们不妨将数组元素与其下标绑定存在哈希表中,其中数组元素为key元素,数组元素下标为value元素,即使用key查找value元素,这时需要满足第三个数存在且在最后两个数的前面表达式为:

dp[i][j] = dp[hash[a]][i] + 1;条件是hash.count(a) && a < arr[i]

3.初始化

一直dp表存储的是斐波那契子序列的最后两个数,所以哪怕没有一条斐波那契子序列最小长度也为2,那么不妨将dp表的所有元素均初始化为2

4.填表顺序

dp表是一个二维表,每次填表都需要找到dp[hash[a]][i],已知hash[a] < i < j,所以一定是从上至下填表,左右顺序随意即可

5.返回值

返回dp表中的最大值即可,注意如果没有找到一条斐波那契子序列那么ret就为2,最后需要返回0,这里需要特殊判断

3.实战代码

class Solution {
public:int lenLongestFibSubseq(vector<int>& arr) {int n = arr.size();unordered_map<int,int> hash;// 哈希表对应位置存储的是对应的下标for(int i = 0;i < n;i++){hash[arr[i]] = i;}int ret = 2;vector<vector<int>> dp(n,vector<int>(n,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;}
};

 


http://www.ppmy.cn/news/1542785.html

相关文章

javascript实现des算法(支持微信小程序)

概述&#xff1a; 本代码是本人从c代码上转换成的javascript代码&#xff0c;并测试验证通过的。考虑放其他地方要么要会员要么容易关闭&#xff0c;不容易被需要的获取到&#xff0c;故直接贴在本文档下面的章节&#xff0c;功能代码。 测试平台&#xff1a; 已经在如下环境…

pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named ‘XXX‘异常的解决办法

问题描述 本地运行正常&#xff0c;集成到Jenkins后使用执行 Windows 批处理命令运行测试用例时报错&#xff1a; D:\PycharmProject\ZeppAndroid>pytest -vs testcase\test_login.py --alluredirreport/allure_json --clean-alluredir ImportError while loading conft…

Redis主从复制:全量复制与增量复制区别与联系

主从复制概述 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 主从复制的作用主要包括&#xff1a; 数据…

深入理解支持向量机:从基本原理到实际应用

第6章 支持向量机 在本章中&#xff0c;我们将深入探讨支持向量机&#xff08;SVM&#xff09;这一强大的分类算法。SVM在模式识别和机器学习领域广泛应用&#xff0c;尤其在处理高维数据时表现出色。我们将依次讨论间隔与支持向量、对偶问题、核函数、间隔与正则化、支持向量…

Notepad++如何同时检索多个关键字

Notepad如何同时检索多个关键字 在 Notepad 中同时检索多个关键字&#xff0c;可以使用以下步骤&#xff1a; 打开 Notepad&#xff1a;启动 Notepad 编辑器。打开查找窗口&#xff1a; 按 Ctrl F 打开查找窗口。 使用正则表达式&#xff1a; 在查找窗口中&#xff0c;切换到…

安全见闻(4)

操作系统和驱动程序 前面我说过这两个也可以称为软件程序的一种&#xff0c;很多程序都是杂糅在一块的 操作系统 注册表&#xff08;在linux里没有&#xff09;linux有类似的&#xff0c;windows才有&#xff08;注册表&#xff09; 防火墙 自启动 计划任务 事件日志 内核驱动…

Android Handler消息机制完全解析-IdleHandler和epoll机制(四)

Android 消息机制Handler完全解析(一) Android 消息机制Handler完全解析(二) Android Handler消息机制-消息屏障(三) 经过前面的学习相信大家对Handler已经有了比较全面且深入的认识&#xff0c;我在写第一篇的时候就说过Handler相关的知识远比我们想象的要多&#xff0c;到这…

如何将 HashiCorp Vault 与 Node.js 集成:安全管理敏感数据

在处理密码、API 密钥或个人用户信息等敏感数据时,安全存储它们至关重要。在源代码中硬编码机密或将其保存在纯文本文件中是一种危险的方法。这就是 HashiCorp Vault 发挥作用的地方。 Vault 是一个用于管理机密(例如凭证、API 密钥和敏感配置)的开源工具。 在本教程中,我将…