热带雨林的昆虫繁殖
题目描述
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成 虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,且可以不停繁殖,第一个月只有一对成虫,问过Z个月以后,共有成虫多少对?
输入格式
一行X,Y,Z用空格隔开,分别表示X个月产Y对卵,繁殖Z个月
1≤X≤20,1≤Y≤20,X≤Z≤39
输出格式
Z月后,成虫的对数。
样例
样例输入
1 2 8
样例输出
37
数据范围与提示
找出当月卵数量的递推式和成虫数量的递推式。
精髓:
(1)首先定义两个数组:
1.a数组表示该月新产出的卵;
2.b数组表示到现在一共的成虫的数量。
(2)寻找递推式:
<1>b[i]=b[i-1]+a[i-2];
b[i-1]:第i-1月一共的成虫。
a[i-2]:因为卵两个月长成成虫,所以第i-2月产出的卵在i月刚好会变成成虫。
两个加起来即是i月一共的成虫。
<2>a[i]=a[i-x]+(b[i-x]-b[i-x-1])y;
a[i-x]:每一个月有多少个卵,那么这一个月对应着就有多少个成虫去产下卵。所以,a[i-x]就相当于第i-x月成虫的个数,这些成虫到了第i月也会产下对应的卵。
(b[i-x]-b[i-x-1])*y:因为一对卵两个月长成成虫,所以第i-1月的卵到了第i月仍是卵。"b[i-x]-b[i-x-1]"表示第i-x-1月到第i-x月增长的成虫的个数,这些成虫是由第i-x-3月产出的卵变化的,它们又会在第i-1月产卵,这些卵到了第i月还是卵。
参考代码:
#include<cstdio>
int main() {
int x,y,z;
long long a[55]={},b[55]={};
scanf("%d %d %d",&x,&y,&z);
for(int i=1;i<=x;i++) {
a[i]=1,b[i]=0;
}
a[x+1]=1,b[x+1]=y;
for(int i=x+2;i<=z+1;i++) {
a[i]=a[i-1]+b[i-2];
b[i]=b[i-x]+(a[i-x]-a[i-x-1])*y;
}
printf("%lld",a[z+1]);
return 0;
}