1312:【例3.4】昆蟲繁殖(遞推演算法)
阿新 • • 發佈:2018-12-06
每對成蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。假設每個成蟲不死,第一個月只有一對成蟲,且卵長成成蟲後的第一個月不產卵(過X個月產卵),問過Z個月以後,共有成蟲多少對?0≤X≤20,1≤Y≤20,X≤Z≤50。
在這裡其實,只知道是類似斐波拉契數列的一類的遞推公式,也就是經典的兔子問題。
第i天的兔子=第i-1的兔子+第i-2的兔子
那麼這道題的思路也是類似的,其實因為每個蟲子從幼蟲到成蟲要2個月,也就是說,決定第i個月的成蟲數量應該是i-1的成蟲和i-2的幼蟲(因為經過2個月就變成成蟲了。)那麼,第i個月的幼蟲,應該是由第i - z個月的成蟲決定的。同時,我們還需要知道一個遞推公式,一定會有一個首項,那就是第一個月只有1對成蟲。
更多的分析在程式碼裡:
#include<iostream> #include<cstdio> using namespace std; #define ll long long int x, y, z; ll a[55], b[55]; int main(){ scanf("%d%d%d", &x, &y, &z); for (int i = 1; i <= x; ++i) a[i] = 1, b[i] = 0; //第一個x月的成蟲數量 for (int i = x + 1; i <= z + 1; ++i) { b[i] = y*a[i - x]; //在i月的幼蟲只與i-z月前的成蟲有關 a[i] = a[i - 1] + b[i - 2];//第i個月的成蟲只與i-1的成蟲和i-2的幼蟲有關。 } printf("%lld\n", a[z + 1]);//過了z個月 }