熱帶雨林的昆蟲繁殖
題目描述
科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。每對成 蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。假設每個成蟲不死,且可以不停繁殖,第一個月只有一對成蟲,問過Z個月以後,共有成蟲多少對?
輸入格式
一行X,Y,Z用空格隔開,分別表示X個月產Y對卵,繁殖Z個月
1≤X≤20,1≤Y≤20,X≤Z≤39
輸出格式
Z月後,成蟲的對數。
樣例
樣例輸入
1 2 8
樣例輸出
37
數據範圍與提示
找出當月卵數量的遞推式和成蟲數量的遞推式。
精髓:
(1)首先定義兩個數組:
1.a數組表示該月新產出的卵;
2.b數組表示到現在一共的成蟲的數量。
(2)尋找遞推式:
<1>b[i]=b[i-1]+a[i-2];
b[i-1]:第i-1月一共的成蟲。
a[i-2]:因爲卵兩個月長成成蟲,所以第i-2月產出的卵在i月剛好會變成成蟲。
兩個加起來即是i月一共的成蟲。
<2>a[i]=a[i-x]+(b[i-x]-b[i-x-1])y;
a[i-x]:每一個月有多少個卵,那麼這一個月對應着就有多少個成蟲去產下卵。所以,a[i-x]就相當於第i-x月成蟲的個數,這些成蟲到了第i月也會產下對應的卵。
(b[i-x]-b[i-x-1])*y:因爲一對卵兩個月長成成蟲,所以第i-1月的卵到了第i月仍是卵。"b[i-x]-b[i-x-1]"表示第i-x-1月到第i-x月增長的成蟲的個數,這些成蟲是由第i-x-3月產出的卵變化的,它們又會在第i-1月產卵,這些卵到了第i月還是卵。
參考代碼:
#include<cstdio>
int main() {
int x,y,z;
long long a[55]={},b[55]={};
scanf("%d %d %d",&x,&y,&z);
for(int i=1;i<=x;i++) {
a[i]=1,b[i]=0;
}
a[x+1]=1,b[x+1]=y;
for(int i=x+2;i<=z+1;i++) {
a[i]=a[i-1]+b[i-2];
b[i]=b[i-x]+(a[i-x]-a[i-x-1])*y;
}
printf("%lld",a[z+1]);
return 0;
}