思路:暴力,枚举斐波那契数列开始的两个值。若长度为2的时候,输出0
时间复杂度有点高,有没有什么优化的方式呢?
①错误思路:
把每次出现的斐波那契数列标记一下,如果下次开始的两个值都出现过,那么就结束。
1 2 3 5 8 (1和2开始,依次标记3,5,8,后续遍历2和3的时候就可以直接终止了)
错误原因:没有考虑到标记的两个数可能不是同一个斐波那契数列得到的
5 7 9 12 14 26 40
5和7标记了12,5和9标记了14。虽然12和14都标记了,但是12和14不能直接终止。
答案:12 14 26 40
②正确思路:
每次暴力取斐波那契数列的前两个值,a和b
若a+b的值出现在原序列中,继续生成下个数,直至生成的数不在原序列中终止。
剪枝:b-a若也在原序列中,那么可以直接终止,以这两个起点的斐波那契数列一定是前面的子序列。
原因:原序列是单调递增的,c=b-a的值若真的在原序列中,那么c一定在a和b的前面。那么c和a组成的斐波那契数列已经统计过了。(a和b)一定是(c和a)的子序列了。
s=input()
s=s.split(" ")
n=len(s)
dict={}
for x in s:
dict[int(x)]=1
ans=0
for i in range(n-1):
for j in range(i+1,n):
a=(int)(s[i])
b=(int)(s[j])
if(b-a not in dict): #没出现过
cnt=2
sum=a+b
while sum in dict:
cnt += 1
a = b
b = sum
sum = a + b
if(cnt>ans):
ans=cnt
if(ans==2):
print(0)
else:
print(ans)
#5 7 9 12 14 26 40
#4