题目描述
如果有一对小兔,每一个月都生下一对小兔,而所生下的每一对小兔在出生后的第三个月也都生下一对小兔。那么,由一对兔子开始,n 个月后有多少对小兔子呢?
输入
输入一个数字 n(1≤n≤100),代表题目中询问的月份。
输出
对于每个询问,输出一行整数,代表 n 月的时候,小兔子的数量。
样例输入1
4
样例输出1
5
样例输入2
65
样例输出2
27777890035288
数据规模与约定
时间限制:1 s
内存限制:64 M
40% 的数据保证 n≤20
100% 的数据保证 n≤100
注意点
递归的效率问题(递归优化,递归+记忆化,反向求解)
数据精度与大小
1.递归+记忆化
#include <bits/stdc++.h>
using namespace std;
#define MAX 100
long long arr[MAX+5]={0};
long long f(int n){
if(n<=2) return n;
if(arr[n]) return arr[n]; //记忆化 记录已经计算过的累加值
arr[n]=f(n-1)+f(n-2);
return arr[n];
}
int main(){
int n;
cin>>n;
cout<<f(n)<<endl;
return 0;
}
2。反向求解
#include <bits/stdc++.h>
using namespace std;
long long f[105]={0};
int main(){
int n;
cin>>n;
f[1]=1;
f[2]=2;
for(int i=3;i<=n;i++){
f[i]=f[i-1]+f[i-2];
}
cout<<f[n]<<endl;
return 0;
}
关于递推问题的求解
正向递推求解——递归
反向递推求解——循环