【题目描述】
科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强。每对成虫过x个月产y对卵,每对卵要过两个月长成成虫。假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0≤X≤20, 1≤Y≤20, X≤Z≤50。
【输入】
x,y,z的数值。
【输出】
过Z个月以后,共有成虫对数。
【输入样例】 1 2 8 【输出样例】 37
【算法分析:】
f[i]表示第i月的成虫数目的话
想要找出一个只含有f的递推式是很困难的,
比如f(i) = [f(i - 1) + f(i - 2) + f(i - 3) + ... + f(i - x)] * y就是错误的
因为“每对卵要过两个月长成成虫”
添加一个辅助数组e,e[i]表示第i月的卵的数目,从而得到两个公式:
e[i] = f[i - x] * y;
f[i] = f[i - 1] + e[i - 2];
注意初始条件:f[0] ~ f[x - 1] = 1
【代码:】
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 5 const long long MAXN = 50 + 1; 6 7 long long x, y, z; 8 long long f[MAXN], e[MAXN]; 9 10 int main() { 11 scanf("%lld%lld%lld", &x, &y, &z); 12 for(int i = 0; i < x; i++) f[i] = 1; 13 for(int i = x; i <= z; i++) { 14 e[i] = f[i - x] * y; 15 f[i] = f[i - 1] + e[i - 2]; 16 } 17 printf("%lld ", f[z]); 18 }