1312:【例3.4】昆虫繁殖
【题目描述】
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过x个月产卵),问过z个月以后,共有成虫多少对?0≤x≤20,1≤y≤20,X≤z≤50。
【输入】
x,y,z的数值。
【输出】
过z个月以后,共有成虫对数。
【输入样例】
1 2 8
【输出样例】
37
其他样例:
【输入样例】
2 3 4
【输出样例】
4
思路:
首先要根据样例,算出每个月的成虫数和虫卵数
月份 | 成虫总数量 a[i] | 卵总数量 |
---|---|---|
x | 健壮的虫+刚长大的虫 | 之前的卵+刚出生的卵宝宝 |
1 | 1 | 2 |
2 | 1 | 2+2=4 |
3 | 1+2=3 | 2+2=4 |
4 | 3+2=5 | 6+2=8 |
5 | 5+2=7 | 10+6=16 |
6 | 7+6=13 | 14+10=24 |
7 | 13+10=23 | 26+14=40 |
8 | 23+14=37 | 46+26=72 |
不难看出需要注意:
根据推算,看起来从第四列开始 a[i]=a[i-1]+两个月前的当月新生虫卵数
,当月新生虫卵数又等于上月(x=1)成虫数*y, 即:a[i]=a[i-1]+a[i-2-x] *y
所以得到—:
递推公式①:
a[i]=a[i-1]+a[i-2-x] *y
或者递推公式②:
a[i]=a[i-1]=b[i-2];
b[i]=b[i-x]*y
推算完成后,一定要注意边界值!即在前x个月,没有产卵!不难看出,以上关系式是不成立的,所以需要分时间段算即:
a[i]=1;b[i]=0
a[i]=1;b[i]=a[i]*y
a[0]=1
//昆虫繁殖
//先通过样例推算,得到a[n]=a[n-1]+a[n-2-x]
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,y,z;
long long a[51],b[51];
a[0]=1; //需要考虑到默认值
cin>>x>>y>>z;
//这是小于x个月之前的原生虫
for(int i=1;i<x;i++){
a[i] = 1;
b[i] = 0;
}
//x~x+2月以后(如果此时月份<2,即卵虫还未成成虫)
for(int i=x;i<x+2;i++){
a[i] = 1;
b[i] = a[i]*y;
}
//递推公式2
// for(int i=x+2;i<=z;i++){
// a[i] = a[i-1]+b[i-2];
// b[i] = a[i-x]*y;
// }
//递推公式1
for(int i=x+2;i<=z;i++){
a[i]=a[i-1]+a[i-2-x]*y;
}
cout<<a[z];
return 0;
}