动态规划学习——斐波那契数列

news2025/2/22 4:26:50

目录

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

1.题目

2.题目接口

3.解题思路及其代码


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

1.题目

如果序列x_1,X_2,...,x_n 满足下列条件,就说它是斐波那契式的:
1.n    >=   3 
2.对于所有i+2 <=n,都有 x_i +X_{i+1} = X_{i+2}
给定一个严格递增的正整数数组形成序列arr,找到arr中最长的斐波那契式的子序列的长度。如果一个不存在,返回0。
(回想一下,子序列是从原序列arr中派生出来的,它从arr中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如,[3,5,8] 是[3, 4,5,6,7,8]的一个子序列)

示例1:
输入: arr = [1,2,3, 4, 5, 6,7,8] 输出:5
解释: 最长的斐波那契式子序列为[1,2,3,5,8] 。
示例2:
输入: arr = [1,3,7,11,12,14,18]输出:3
解释: 最长的斐波那契式子序列有[1,11,12]、[3,11,14] 以及 [7,11,18] 。

提示:
arr.length    1000    
1
arr[il<arr[i + 1]<= 10^9

2.题目接口

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {

    }
};

3.解题思路及其代码

这道题我们还是用动态规划的思想来解决。解决步骤如下:

1.状态转移方程:

状态转移方程的定义还是以老套路:以dp[i]位置为结尾表示以i位置为结尾的最长的斐波那契数列。但是我们在这道题里面该用什么表示这个状态转移方程呢?我的解决方法是用二维数组的方式。以dp[i][j]表示以arr[i]和arr[j]为结尾的的子序列的最长长度。那我们的dp[i][j]又该如何推导呢?dp[i][j] = dp[k][i]+1(dp[k][i]表示以arr[k]和arr[i]为结尾的最长的斐波那契数列,加1表示当arr[j]与能作为斐波那契数列的一份子时加上arr[j]这个位置)。

2.初始化:

因为斐波那契数列的长度至少为3。所以我们在初始化dp表时可以先初始化为2.如下:

int n = arr.size();
vector<vector<int>>dp(n,vector<int>(n,2));

然后在返回时做如下判断:

return Maxlenth == 2?0:Maxlenth;

便可以返回最终的正确结果。

3.优化:

这道题如果不进行优化处理,那这道题的时间复杂度将会达到n^3。因为填表时要利用三层循环。但是如果进行如下优化:利用unordered_map将数组元素和下标进行绑定。

 unordered_map<int,int>hash;
 for(int i = 0;i<n;i++)
{
  hash[arr[i]] = i;//下标和数组的值进行绑定
}

便可以将时间复杂度降到n^2。

解题代码如下:

class Solution {
public:
    int lenLongestFibSubseq(vector<int>& arr) {

        int n = arr.size();

        vector<vector<int>>dp(n,vector<int>(n,2));

        unordered_map<int,int>hash;

        for(int i = 0;i<n;i++)
        {
            hash[arr[i]] = i;//下标和数组的值进行绑定
        }

        int Maxlenth = 2;

        for(int j = 2;j<n;j++)
        {
            for(int i = 1;i<n;i++)
            {
                int num = arr[j] - arr[i];//前面的数的大小
                if(hash.count(num)&&hash[num]<i)//这里的顺序不能变
                {
                    dp[i][j] = dp[hash[num]][i]+1;
                }

               Maxlenth = max(Maxlenth,dp[i][j]);
            }
            
        }

        return Maxlenth == 2?0:Maxlenth;

    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253877.html

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

相关文章

中间件介绍

一、中间件介绍 官方的说法&#xff1a;中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统&#xff0c;用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。 但是由于其影响的是全局&#xff0c;所以需…

HashMap的实现原;HashMap的工作原理;HashMap存储结构; HashMap 构造函数

文章目录 说一下HashMap的实现原理(非常重要)①HashMap的工作原理HashMap存储结构常用的变量HashMap 构造函数tableSizeFor() put()方法详解hash()计算原理resize() 扩容机制get()方法为什么HashMap链表会形成死循环 HashMap是我们在工作中使用到存储数据特别频繁的数据结构&am…

韵达快递查询,韵达快递单号查询,一键筛选出单号中的退回件

批量查询韵达快递单号的物流信息&#xff0c;并将其中的退回件一键筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#xff…

短期的规划

大方向&#xff1a; 学习编程的前期 大二上学期&#xff1a; 前期追求知识点的广度&#xff1a; 对各类数据结构的了解 熟悉数据库的各类操作&#xff0c;JDBC熟练使用 与此同时&#xff0c;提高写作能力&#xff0c;学习沉淀&#xff0c;提高技术影响力 大二的寒假&…

Java中的异常语法知识居然这么好玩!后悔没有早点学习

学习异常后&#xff0c;发现异常的知识是多么的吸引人&#xff01;不仅可以用来标记错误&#xff0c;还可以自己定义一个异常&#xff0c;用来实现自己想完成的业务逻辑&#xff0c;接下来一起去学习吧 目录 一、异常的概念及体系结构 1.异常的概念 2.异常的体系结构 3.异常…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《前景导向的主动配电网智能储能软开关规划方法》

这个标题涉及到电力系统中的主动配电网&#xff08;Active Distribution Network&#xff09;以及与之相关的智能储能软开关的规划方法。下面是对标题中各个关键词的解释&#xff1a; 前景导向的&#xff08;Future-oriented&#xff09;&#xff1a; 这表明该方法是以未来发展…

2022年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2022 年全国硕士研究生入学统一考试管理类专业学位联考数学试题一、问题求解&#xff1a;第 1∼15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的&#xff0c;请在答&#xff0e;题…

strlen和sizeof练习题(以64位机器为例)

例一 一般情况下&#xff0c;数组名表示首元素地址&#xff0c;只有在以下的情况中数组名表示整个数组的地址&#xff1a; 1.sizeof&#xff08;数组名&#xff09;&#xff1a;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff1a;这里的…

五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度(MATLAB)

一、多目标优化算法简介 &#xff08;1&#xff09;多目标粒子群优化算法MOPSO 多目标应用&#xff1a;基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度&#xff08;MATLAB代码&#xff09;-CSDN博客 &#xff08;2&#xff09;多目标人工蜂鸟算法&#xff08;MOAHA…

C语言进阶之笔试题详解(1)

引言&#xff1a; 对指针知识进行简单的回顾&#xff0c;然后再完成笔试题。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言&#xff1a; 知识简单回顾 指针是什么 指针变…

分布式篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如何将长链接转换成短链接,并发送短信?二、长链接和短链接如何互相转换?三、长链接和短链接的对应关系如何存储?四、如何提高系统的并发能力?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一…

航天宏图——宏图1号样例数据0.5米-5米分辨率(上海部分)

简介&#xff1a; 作为航天宏图“女娲星座”建设计划的首发卫星&#xff0c;航天宏图-1号可获取0.5米-5米的分辨率影像&#xff0c;具备高精度地形测绘、高精度形变检测、高分辨率宽幅成像以及三维立体成像等能力&#xff0c;在自然资源、应急管理、水利等行业与领域具有极高的…

【开源】基于Vue和SpringBoot的数字化社区网格管理系统

项目编号&#xff1a; S 042 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S042&#xff0c;文末获取源码。} 项目编号&#xff1a;S042&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…

LCM-LoRA模型推理简明教程

潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像&#xff0c;从而可以在几乎实时的设置中使用扩散模型。 来自官方网站&#xff1a; LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 小时&#xff09;即可从任何预训练的稳定扩散 (SD) 中提取出来&#…

【深度学习笔记】03 微积分与自动微分

03 微积分与自动微分 导数和微分导数解释的可视化偏导数梯度链式法则自动微分非标量变量的反向传播分离计算 导数和微分 假设我们有一个函数 f : R → R f: \mathbb{R} \rightarrow \mathbb{R} f:R→R&#xff0c;其输入和输出都是标量。 如果 f f f的导数存在&#xff0c;这个…

按需引入 ElMessage,没有样式且类型检查失败

文章目录 ElMessage 弹框没有样式问题描述解决方案 ts 类型检查失败问题描述解决办法 eslint 检查失败问题描述解决办法 ElMessage 弹框没有样式 问题描述 Element-plus 在使用 ElMessage 消息弹框的时候没有样式&#xff0c;按照官方的按需加载的方式引入的 import { ElMes…

Kafka系列 - Kafka一篇入门

Kafka是一个分布式流式处理平台。很多分布式处理系统&#xff0c;例如Spark&#xff0c;Flink等都支持与Kafka集成。 Kafka使用场景 消息系统&#xff1a;Kafka实现了消息顺序性保证和回溯消费。存储系统&#xff1a;Kafka把消息持久化到磁盘&#xff0c;相比于其他基于内存的…

PropertyTokenizer属性解析器实现,So Easy

PropertyTokenizer是Mybatis中的属性解析器&#xff0c;其主要实现原理如下&#xff1a; public PropertyTokenizer(String fullname) {// 判断是否以“.”分隔int delim fullname.indexOf(.);if (delim > -1) {name fullname.substring(0, delim);children fullname.su…

1 时间序列模型入门: LSTM

0 前言 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种用于处理序列数据的神经网络。相比一般的神经网络来说&#xff0c;他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义&#xff0c;RNN就能够很好…

抖音小店开店指南:流程、准备和营销策略一站解析

抖音小店已成为一个热门的社交电商平台&#xff0c;为商家提供了一个快速、方便、低成本的开店通道。下面四川不若与众将介绍抖音小店开店的流程和需要准备的工作&#xff0c;帮助商家顺利开启自己的电商之路。 一、开店准备工作&#xff1a; 1. 产品准备&#xff1a;确定出售…