版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Lngxling/article/details/82924217
题意:
有1000个数,问能形成的最长斐波那契数列的长度
思路:
只要确定了数列的前两项,数列就已经确定了,所以可以枚举前两项,来找剩下的最长
因为数的绝对值小于1e9,斐波那契数列的增长速度很快,项数很少
用map记录了一下每个数出现的个数,方便搜索
要特判0的情况,因为0很多,就退化为n^3的复杂度了
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long
#define max_ 100010
#define mod 1000000007
#define inf 0x3f3f3f3f
int n;
ll num[1010];
map<ll,int>mp;
void dfs(ll x,ll y,int &ans)
{
ll k=x+y;
if(mp[k])
{
mp[k]--;
ans++;
dfs(y,k,ans);
mp[k]++;
}
}
int main(int argc, char const *argv[]) {
scanf("%d",&n);
int f=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&num[i]);
mp[num[i]]++;
if(num[i]==0)
f++;
}
if(f==n)
{
printf("%d\n",n );
return 0;
}
int maxx=f;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
continue;
if(num[i]==0&&num[j]==0)
continue;
int ans=2;
mp[num[i]]--;
mp[num[j]]--;
dfs(num[i],num[j],ans);
mp[num[i]]++;
mp[num[j]]++;
if(ans>maxx)
maxx=ans;
}
}
printf("%d\n",maxx );
return 0;
}