码迷,mamicode.com
首页 > 其他好文 > 详细

Fibonacci-ish 大数标记map+pair的使用

时间:2018-04-05 23:15:06      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:nbsp   int   air   ble   --   nta   void   使用   prefix   

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.

Examples

Input
3
1 2 -1
Output
3
Input
5
28 35 7 14 21
Output
4

Note

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.

 

个人非常喜欢的一道题,比较综合。用到了一些套路,比如用map标记大数,以及加上pair来标记一组数。

开始有往dp方向考虑,想先给数列排个序,然后依次往右找。但是两数相加不一定会变大,和可能会在左边,比如本题负数情况。

再一个每次寻找下一个值时,都要重新使用标记,为了防止后效性,使用递归来处理。

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<set>
#include<map>
#include<algorithm>
#define MAX 1005
#define INF 0x3f3f3f3f
using namespace std;

int a[MAX],c;
map<int,int> mp;
map<pair<int,int>,int> mmp;
void dfs(int x,int y){     //递归寻找
    
    if(mp[x+y]>0) {
        c++;
        mp[x+y]--;
        dfs(y,x+y);
        mp[x+y]++;
    }
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        mp[a[i]]++;      //大数标记
    }
    int max=0;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){    //考虑负数情况
            if(i!=j){
                if(mmp[make_pair(a[i],a[j])]) continue;
                mmp[make_pair(a[i],a[j])]=1;     //标记一对数,优化防T
                c=2;
                mp[a[i]]--;
                mp[a[j]]--;
                dfs(a[i],a[j]);
                mp[a[i]]++;
                mp[a[j]]++;
                if(c>max) max=c;
            }
        }
    }
    printf("%d\n",max);
    return 0;
}

 

Fibonacci-ish 大数标记map+pair的使用

标签:nbsp   int   air   ble   --   nta   void   使用   prefix   

原文地址:https://www.cnblogs.com/yzm10/p/8724574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!