【ZCMU2993】Fibonacci-ish(暴力dfs+map使用)

题目链接

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

  1. the sequence consists of at least two elements
  2. f0 and f1 are arbitrary
  3. 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;
}

猜你喜欢

转载自blog.csdn.net/qq_39826163/article/details/82758206