本题主要是求一串数组成的序列中,最长的斐波那契子序列的长度
思路:
个人理解,斐波那契数列的精髓在于你知道某两个数,就可以一直往前/往后推出整个数列的所有数,所以我们可以设任意两个数为该斐波那契子序列的最后两个数(作为一个状态),然后写出动态转移方程:ans[i][j] = ans[j][k] + 1(若ans[j][k] = 0,则改成+3)
可能是我多年封印的动态规划突然开窍了…O(∩_∩)O
from typing import List
class Solution:
def lenLongestFibSubseq(self, A: List[int]) -> int:
if len(A) <= 2:
return 0
dic = {}
for i in range(len(A)):
dic[A[i]] = i
ans = [[0 for i in range(len(A))] for j in range(len(A))]
max_len = 0
for i in range(1, len(A)):
for j in range(0, i):
k = A[i] - A[j]
if k >= A[j] or k not in dic.keys():
continue
k = dic[k]
if ans[j][k] == 0:
ans[i][j] = 3
else:
ans[i][j] = ans[j][k] + 1
max_len = max(max_len, ans[i][j])
return max_len

本文介绍了一种求解最长斐波那契子序列的动态规划算法,通过设定任意两个数作为子序列的最后两个数,利用动态转移方程进行求解。详细解释了算法的实现过程和代码示例。
158

被折叠的 条评论
为什么被折叠?



