codeforces633D. Fibonacci-ish (暴力+stl+dfs)

题意:给你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]++;
 }
}
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);
}

猜你喜欢

转载自blog.csdn.net/running_acmer/article/details/80503731