题意:
现有一个数组,从中任意选一些数构成一个斐波那契数列,问能够成的最长数列的长度是多少
题解:
一堆绝对值<=10^9的数用来构造斐波那契数列,虽然斐波那契数列增长不快,但是长度也不可能超过100,暴力枚举最开始的两个数,尝试能否构成即可
O(n^2)
数据可能会有很多0的情况 要单独特判。。
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100100
#define MOD 1000000007
int n,m;
long long a[1010],b[1010];
map<long long,int> mp;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t,C = 1;
//scanf("%d",&t);
while(scanf("%d",&n) != EOF)
{
mp.clear();
int num = 0;
for(int i = 0; i < n; i++)
{
scanf("%lld",&a[i]);
mp[a[i]]++;
if(!a[i])
num++;
}
int ans = 2;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
if(i == j)
continue;
if(!a[i] && !a[j])
{
ans = max(ans,num);
continue;
}
b[0] = a[i];
b[1] = a[j];
mp[a[i]]--;
mp[a[j]]--;
int k = 2;
long long l = a[i],r = a[j];
while(1)
{
if(mp.count(l+r) && mp[l+r] > 0)
{
long long p = l + r;
mp[p]--;
b[k++] = p;
l = r;
r = p;
}
else
{
for(int o = 0; o < k; o++)
mp[b[o]]++;
break;
}
}
ans = max(ans,k);
}
printf("%d\n",ans);
}
return 0;
}
题意:
现有一个数组,从中任意选一些数构成一个斐波那契数列,问能够成的最长数列的长度是多少
题解:
一堆绝对值<=10^9的数用来构造斐波那契数列,虽然斐波那契数列增长不快,但是长度也不可能超过100,暴力枚举最开始的两个数,尝试能否构成即可
O(n^2)
用离散化存数的时候一开始没考虑到 f0 = f1的情形