Length of Longest Fibonacci Subsequence
A sequence X_1, X_2, …, X_n is fibonacci-like if:
n >= 3
X_i + X_{i+1} = X_{i+2} for all i + 2 <= n
Given a strictly increasing array A of positive integers forming a sequence, find the length of the longest fibonacci-like subsequence of A. If one does not exist, return 0.
(Recall that a subsequence is derived from another sequence A by deleting any number of elements (including none) from A, without changing the order of the remaining elements. For example, [3, 5, 8] is a subsequence of [3, 4, 5, 6, 7, 8].)
Example
Input: [1,2,3,4,5,6,7,8]
Output: 5
Explanation:
The longest subsequence that is fibonacci-like: [1,2,3,5,8].
Solution
func lenLongestFibSubseq(A []int) int {
N := len(A)
ret:= 0
m := make(map[int]int)
dp := make([][]int, N+1)
for i:=0;i<N;i++{
dp[i] = make([]int, N+1)
m[A[i]] = i
for j:=0;j<i;j++{
if v,ok:= m[A[i]-A[j]];ok && A[i]-A[j]<A[j] && v>=0{
dp[j][i] = dp[v][j]+1
} else{
dp[j][i] = 2
}
ret = max(dp[j][i], ret)
}
}
if ret>2{
return ret
} else{
return 0
}
}
func max(a, b int)int{
if a>b {
return a
} else {
return b
}
}