<<信息学奥赛一本通>> 昆虫养殖 题解
【题目描述】
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0≤X≤20,1≤Y≤20,X≤Z≤50。
【输入】
x,y,z的数值。
【输出】
过Z个月以后,共有成虫对数。
【输入样例】
1 2 8
【输出样例】
37
这题从兔子生小兔子衍生出来的递推题。
通过观察可以发现,成虫数量与幼虫数有关。而幼虫数又与成虫数有关。
所以我们就可以发现这个题目要用 二个数组 去记录数量。
按照惯例 设A(Adult)为成虫数,A[i]为当前i月的成虫数。C为幼虫数。
用递推式:
A[i] = A[i-1] + C[i-2] (这个月的成虫数 = 上月的成虫书 +
前2个月的幼虫数-因为幼虫变为成虫了 )
C[i] = y*A[i-x] (而这个月的幼虫数 = 上X个月的成虫生的)
#include <iostream>
#define MAXN 50
using namespace std;
long long A[151],C[151];
int main(){
int x,y,z;
cin >> x >> y >> z;
for(int i=0;i<x;++i){//过X月开始出现幼虫
A[i] = 1;
C[i] = 0;
}
for(int i=x;i<z+1;++i){
C[i] = y*A[i-x];
A[i] = A[i-1] + C[i-2];
}
cout << A[z] << endl;
return 0;
}