2993: Fibonacci-ish
Time Limit: 2 Sec Memory Limit: 256 MB
Submit: 30 Solved: 13
[Submit][Status][Web Board]
Description
D. Fibonacci-ish
Yash has recently learnt about the Fibonacci sequence and is very excited about it. He calls a sequence Fibonacci-ish if
- the sequence consists of at least two elements
- f0 and f1 are arbitrary
- fn+2=fn+1+fn for all n≥0.
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.
Input
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).
Output
Print the length of the longest possible Fibonacci-ish prefix of the given sequence after rearrangement.
Sample Input
3
1 2 -1
Sample Output
3
HINT
In the first sample, if we rearrange elements of the sequence as -1, 2, 1, the whole sequence ai would be Fibonacci-ish.
【题意】
已知n个数,构造一个最长的符合斐波那契的数列,输出最长的长度。
【解题思路】
直接暴力枚举前两个数,用m1记录每个数出现的次数,m2记录前两个数是否已经搜索过,注意回溯,并且注意最后答案需要+2。因为题中已经明确这个序列至少存在两个数,所以不存在序列(1 5 9)。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+5;
int a[maxn];
map<int,int>m1;
map<pair<int,int>,int>m2;
int dfs(int x,int y)
{
if(!m1[x+y])return 0;
m1[x+y]--;
int ans=dfs(y,x+y)+1;
m1[x+y]++;
return ans;
}
int main()
{
int n,ans=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
m1[a[i]]++;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)continue;
if(m2[make_pair(a[i],a[j])])continue;
m2[make_pair(a[i],a[j])]=1;
m1[a[i]]--;
m1[a[j]]--;
ans=max(ans,dfs(a[i],a[j]));
m1[a[i]]++;
m1[a[j]]++;
}
}
printf("%d\n",ans+2);
return 0;
}