力扣题解(最长的斐波那契子序列的长度)

如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:

  • n >= 3
  • 对于所有 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] 的一个子序列)

思路:

首先,本题中要求i位置的斐波那契子序列,一定和(0-i-1)的元素有关,因为是在(0-i-1)中的某些元素加上i位置元素构成以i位置为最后一个元素的最长斐波那契子序列。但如果仅仅是一维的dp,此时只能知道(0-i-1)的dp的值,无法得知具体构成,此时无法确定(0-i-1)内的最长斐波那契子序列加上i位置的元素是否仍能构成斐波那契子序列。因此需要多维dp[i][j],表示前一个元素是i位置,后一个元素是j位置去构成斐波那契子序列,这时候在前面符合要求的元素的值就是arr[j]-arr[i],只有满足数值的才可能能构成斐波那契数列。此外,对于满足的数值,若其下标出现在i,j之间,则可以由dp[k][j]来表示(此时i出现在k前面),因此对于dp[i][j]忽略这种情况,以保证所满足的数值一定出现在i前面。当k出现在前面时,k位置构成的斐波那契数列加上i位置,j位置元素不受影响一定还是斐波那契数列,因此符合要求。dp[i][j]=1+dp[k][i]。

核心思路就是用多维表示。

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;
     hash[arr[0]]=0;
     for(int i=1;i<n;i++)
     { 
        for(int j=i+1;j<n;j++)
        {   
             int a=arr[j]-arr[i];
            if(hash.count(a)&&hash[a]<i)
            {
                 dp[i][j]=max(dp[i][j],dp[hash[a]][i]+1 );
            }
           
        }
        hash[arr[i]]=i;
     }
     int ret=0;
     for(auto e:dp)
     {  
        for(auto s:e)
        ret=max(ret,s);

     }

     return ret>2?ret:0;
    }
};

相关推荐

  1. 题解序列长度

    2024-07-14 03:50:03       25 阅读
  2. 序列长度【动态规划解决】

    2024-07-14 03:50:03       56 阅读
  3. 【算法】【动规】序列长度

    2024-07-14 03:50:03       68 阅读
  4. 2781.合法字符串长度

    2024-07-14 03:50:03       26 阅读
  5. 题解递增序列

    2024-07-14 03:50:03       25 阅读
  6. 题解定差序列

    2024-07-14 03:50:03       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-14 03:50:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-14 03:50:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-14 03:50:03       58 阅读
  4. Python语言-面向对象

    2024-07-14 03:50:03       69 阅读

热门阅读

  1. Mojo: 轻量级Perl框架的魔力

    2024-07-14 03:50:03       22 阅读
  2. 最长上升子序列(最长递增子序列,LIS)

    2024-07-14 03:50:03       21 阅读
  3. 【docker镜像如何在不同的架构上运行】

    2024-07-14 03:50:03       19 阅读
  4. 第九十五周周报

    2024-07-14 03:50:03       15 阅读
  5. Python input NameError: name ‘xxx‘ is not defined.

    2024-07-14 03:50:03       18 阅读
  6. 【数据结构】二叉树

    2024-07-14 03:50:03       21 阅读
  7. AWS认证SAA-C03每日一题

    2024-07-14 03:50:03       17 阅读
  8. 高项-信息化发展知识要点

    2024-07-14 03:50:03       18 阅读
  9. 什么是开放最短路径优先(OSPF)

    2024-07-14 03:50:03       18 阅读