一、题目描述
如果序列 X_1, X_2, ..., X_n 满足下列条件,就说它是 斐波那契式 的:
n >= 3
对于所有 i + 2 <= n,都有 X_i + X_{i+1} = X_{i+2}
给定一个严格递增的正整数数组形成序列,找到 A 中最长的斐波那契式的子序列的长度。如果一个不存在,返回 0 。
(回想一下,子序列是从原序列 A 中派生出来的,它从 A 中删掉任意数量的元素(也可以不删),而不改变其余元素的顺序。例如, [3, 5, 8] 是 [3, 4, 5, 6, 7, 8] 的一个子序列)
输入: [1,3,7,11,12,14,18]
输出: 3
解释:
最长的斐波那契式子序列有:
[1,11,12],[3,11,14] 以及 [7,11,18] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入: [1,2,3,4,5,6,7,8] 输出: 5 解释: 最长的斐波那契式子序列为:[1,2,3,5,8] 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-longest-fibonacci-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
本题可以采用动态规划的方法来解答,定义动态规划方程。
设斐波那契序列中的两个连续项A[i],A[j]表示为(i,j),则整个子序列就是这些连续结点的路径。
对于斐波那契子序列A[1]=1,A[2]=2,A[3]=3,A[5]=5,A[8]=8,连续结点的路径为(1,2) (2,3) (3,5) (5,8)。
只有当A[i]+A[j]=A[k]时,结点(i,j) 、(j,k)才能组成连续的路径
设longest[i,j]表示 序列i到j的最长斐波那契子序列的长度则
longest[i,j]=Math.max(longest[i,j],longest[k,i]+1) 其中 k<i 且 A[k]+A[i]=A[j]
import java.util.*;
class Solution {
public int lenLongestFibSubseq(int[] A) {
int len=A.length;
Map<Integer,Integer> valueIndex=new HashMap<Integer,Integer>();
int [][]longest=new int[len][len];
int maxValue=0;
for (int i=0;i<len;i++){
valueIndex.put(A[i],i);
}
for (int i=0;i<len;i++){
for (int j=i+1;j<len;j++){
longest[i][j]=2;
}
}
for (int i=0;i<len;i++){
for (int j=i+1;j<len;j++){
int kValue=A[j]-A[i];
if(valueIndex.containsKey(kValue)){
int kIndex=valueIndex.get(kValue);
if(kIndex<i)
longest[i][j]=Math.max(longest[i][j],longest[kIndex][i]+1);
}
maxValue=Math.max(maxValue,longest[i][j]);
}
}
return maxValue>2?maxValue:0;
}
}
解题思路参考官方题解