用b数组做了一个记忆化,如果之前算过20(最大值),则接下来小于20的,直接输出,不需要再递归一次。
#include<bits/stdc++.h>
using namespace std;
int n,a;
long long b[25]; // 用b做记忆化
long long dg(int a){
if(a==1||a==2){
b[1] = 1;
b[2] = 1;
return 1;
}
if(a<1){
b[0] = 0;
return 0;
}
b[a] = dg(a-1)+dg(a-2);
return dg(a-1)+dg(a-2);
}
int main(){
cin>>n;
int max_a = -1;
while(n--){
cin>>a;
if(a<=max_a){ // 用b[]做记忆化 ,如果少于最大值的,则不用再算,直接拿来用。
cout<<b[a]<<endl;
continue;
}
max_a = max(a,max_a);
cout<<dg(a)<<endl;
}
return 0;
}