【问题描述】
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过x个月产卵),问过z个月以后,共有成虫多少对?0≤x≤20,1≤y≤20,X≤z≤50。
【输入】
x,y,z的数值。
【输出】
过z个月以后,共有成虫对数。
【输入样例】
1 2 8
【输出样例】
37
【算法分析】
题目中要求的是z个月后的成虫个数,即第z+1个月的成虫个数。我们只需定义一个数组a存储每个月成虫的个数。考虑到每个月会有卵变成新的成虫,所以我们还需定义一个数组b存储每个月的新增卵的数量。
递推公式为 a[i] = a[i-1] + b[i-2]。(第i个月的成虫数量a[i],等于第(i-1)个月的成虫数量a[i-1],加上第(i-2)个月的新增卵数量b[i-2])
【参考程序】
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
long long a[101]; // a[i]存储第i个月的成虫数量
long long b[101]; // b[i]存储第i个月新增卵的数量
int x, y, z;
cin >> x >> y >> z; // 过x个月产y对卵,过z个月
for (int i=1; i<=x; i++) {
a[i] = 1;
b[i] = 0;
}
for (int i=x+1; i<=z+1; i++) { // 因为要统计到底z个月后,所以要for到z=1
b[i] = y * a[i-x]; // 第i个月新增卵的数量b[i] = x个月之前成虫的数量a[i-x] * 每对成虫产卵的数量y
a[i] = a[i-1] + b[i-2]; // 第i个月的成虫数量a[i] = 第i-1个月的成虫数量a[i-1] + 第i-2个月新增卵的数量b[i-2]
}
cout << a[z+1] << endl;
return 0;
}