题意:给你n个数, 问最长的题目中定义的斐波那契数列。
思路:因为n给的范围比较小,所以二重循环暴力一下确定f1,f2然后不断往下推,用map(logn)查找是否存在f1+f2;同时不断更新长度的最大值。但是需要注意的是:
1.一个数可能出现多次,所以要用map记录次数。在一个数已经被数列使用后,次数减减,在不断递推的过程中不断更新改变,但是完成后必须恢复到原状态,我是使用了dfs来回溯的时候复原,一开始做的时候没有注意到这点。
2.零时需要特判
代码:
#include<cstdio>
#include<map>
#include<algorithm>
using namespace std;
map<int,int>c;
int a[10006];
int ans=0;
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]++;
}
}
#include<map>
#include<algorithm>
using namespace std;
map<int,int>c;
int a[10006];
int ans=0;
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;
scanf("%d",&n);
int zero=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
c[a[i]]++;
if(a[i]==0)zero++;
}
int x,y;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int cnt=2;
if(i==j)continue;
if(a[i]==0&&a[j]==0){//特判
ans=max(ans,zero);
continue;
}
c[a[i]]--;
c[a[j]]--;
dfs(a[i],a[j],2);
c[a[i]]++;
c[a[j]]++;
}
}
printf("%d\n",ans);
}
int n;
scanf("%d",&n);
int zero=0;
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
c[a[i]]++;
if(a[i]==0)zero++;
}
int x,y;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int cnt=2;
if(i==j)continue;
if(a[i]==0&&a[j]==0){//特判
ans=max(ans,zero);
continue;
}
c[a[i]]--;
c[a[j]]--;
dfs(a[i],a[j],2);
c[a[i]]++;
c[a[j]]++;
}
}
printf("%d\n",ans);
}