【題目描述】
科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。每對成蟲過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\n", f[z]); 18 }