【openjudge】【遞推】例3.4 昆蟲繁殖


【題目描述】

科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。每對成蟲過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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM