动态规划做法
class Solution:def lenLongestFibSubseq(self, arr):size = len(arr)dp = [[2] * size for _ in range(size)]maxv = 0for i in range(2, size):for j in range(1, i):d = arr[i] - arr[j]l, r = 0, j - 1while l <= r:mid = (l + r) // 2if arr[mid] == d:l = midbreakif l == r:l = -1breakif arr[mid] < d:l = mid + 1else:r = mid - 1if l != -1:dp[i][j] = max(dp[i][j], dp[j][l] + 1)maxv = max(maxv, dp[i][j])return maxv if maxv >= 3 else 0
二维数组,初始值为2(至少长度为3才能满足斐波那契)
dp[i][j]状态表示:到i为止,上一步位置为j的子序列最大长度。
--从2到size遍历i
--从1到size遍历j
--计算元素i和元素j的差值d,在j前面的数组中查询是否存在差值d
--如果存在,更新dp[i][j]为其和dp[j][l]+1中的较大值(到j为止,上一个位置为l的子序列长度+1)
同时更新maxv记录全局最大长度
--返回maxv,如果全局最大长度<=3则返回0