http://codeforces.com/contest/633/problem/D
Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if
You are given some sequence of integers a1, a2, ..., an. Your task is rearrange elements of this sequence in such a way that its longest possible prefix is Fibonacci-ish sequence.
The first line of the input contains a single integer n (2 ≤ n ≤ 1000) — the length of the sequence ai.
The second line contains n integers a1, a2, ..., an (|ai| ≤ 109).
Print the length of the longest possible Fibonacci-ish prefix of the given sequence after rearrangement.
3 1 2 -1
3
5 28 35 7 14 21
4
In the first sample, if we rearrange elements of the sequence as - 1, 2, 1, the whole sequence ai would be Fibonacci-ish.
In the second sample, the optimal way to rearrange elements is , , , , 28.
题目大意:
给一个数列。根据斐波那契数列的定义,得出最长的子序列。
思路:
因为是斐波那契数列,所以说如果前两项知道了,那么后面的数列就排好了。题解上面还有写到,因为斐波那契数列是接近于2的幂的,所以说最长的子序列是90.但是可能存在全都是0的子序列。所以要特别注意一下。
这道题想了好久还是不会做就看了一下别人的题解。
主要的方法是如下,首先,因为前两项是不知道的,所以要枚举所有的可能性,那就是n^2。然后因为要通过lower_bound来寻找函数(表示这点想到了,但是之前自己写的时候不知道为什么TLE了),所以说之前要排序。然后就是离散化了,将状态进行压缩,用b数组来记录一下a数组中重复的值。
还有一点就是用pos[]数组来保存值。
感觉这道题学到了一下几点
①可以用pos数组来储存下标。表示以前都是用pos来储存的,没怎么用过数组。
②离散化。减少重复的搜索和代码的长度,优化了。
③大牛代码中的思考条件都十分的全面,尤其是if中,一定要好好学习。
④最后别忘了使用过一次以后都加回来。
下面给出临摹的代码:(本人现在也只有这水平了。。。不过还是有点不一样的啦)