---
# System prepended metadata

title: 873\. Length of Longest Fibonacci Subsequence

---

# 873\. Length of Longest Fibonacci Subsequence

similar: https://hackmd.io/@y56/BkxGyewa9

similar: https://leetcode.com/problems/arithmetic-slices-ii-subsequence/discuss/1455658/C%2B%2BJavaPython-DP-with-Picture-explained-Clean-and-Concise

```python=
class Solution:
    def lenLongestFibSubseq(self, arr: List[int]) -> int:
        dp = {}  # dp[a, b] is the length of Fibonacci sequence ending with a, b
        for i in range(len(arr)):
            for j in range(i + 1, len(arr)):
                # Iterate over all pairs.
                previous_endpoint_index = i
                this_endpoint_index = j
                previous_number = arr[previous_endpoint_index]  # b
                this_number = arr[this_endpoint_index]  # c
                further_previous_number = this_number - previous_number  # a
                # a, b, c # a + b = c
        
                # dp[a, b] + 1 = dp[b ,c]
                dp[(this_endpoint_index, previous_number)] = dp.get(
                    (previous_endpoint_index, further_previous_number), 1) + 1
                #                                                       ^
                # If no previous sequence, this is the start of a new sequece, length: 2
        longest = max(dp.values())
        return longest if longest >= 3 else 0  # only len>=3 is valid
    
class Solution:
    def lenLongestFibSubseq(self, arr: List[int]) -> int:
        set_arr = set(arr)
        res = 2
        for i in range(len(arr)):
            for j in range(i + 1, len(arr)):
                # Try all starting pairs.
                a, b = arr[i], arr[j]
                length = 2
                while a + b in set_arr:
                    a, b = b, a + b
                    length += 1
                res = max(res, length)
        return res if res > 2 else 0
```