题意:给一个长为n的序列,求出fn=fn-1+fn-2(满足斐波那契)成立的最长序列。
n<=1e3 任意枚举两个下标作为前两项 后面项用map判断是否存在即可 因为a[i]<=1e9 fib增长很快 长度最多为90 所以O(n*n*l)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
using namespace std;
typedef long long ll;
const int N=1e3+20;
int a[N],ans;
map <ll,ll> c;
void dfs(int x,int y,int cnt)
{
ans=max(ans,cnt);
if(c[x+y])
{
c[x+y]--;
dfs(y,x+y,cnt+1);
c[x+y]++;
}
}
int main()
{
int n;
int zero=0;
cin>>n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
c[a[i]]++;
if(a[i]==0)
zero++;
}
for(int i=0;i<n;i++)//枚举任意两个下标作为f1,f2
{
for(int j=0;j<n;j++)
{
if(i==j) continue;
if(a[i]==0&&a[j]==0)//特判: 0,0的情况
{
ans=max(ans,zero);
continue;
}
c[a[i]]--;
c[a[j]]--; //用完记得减去 0,2
dfs(a[i],a[j],2);
c[a[i]]++;//回溯
c[a[j]]++;
}
}
cout<<ans<<endl;
return 0;
}