1. 程式人生 > >母牛的故事(hdoj 2018,動態規劃遞推,詳解)

母牛的故事(hdoj 2018,動態規劃遞推,詳解)

有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?

Sample Input
2
4
5
0
Sample Output
2
4
6

//本程式碼為只輸入一組資料的答案
//方法1:找規律找出來a[i]=a[i-1]+a[i-3] (ps:我第一次就是這樣做出來的)
//方法2:歸納出狀態轉移方程
//現在解釋一下為什麼a[i] = a[i - 1] + a[i - 3]
//假如i-1年到i年每變化,則a[i] = a[i - 1]
//可是現在要考慮新的母牛和小牛,
//然後把目光放回i-3年.
//為什麼是i-1年?
//i-1年有三種牛:第一種:母牛,,,第二種:這一年剛出生的小牛,,,
//第三種:這一年之前出生的小牛,但是這種牛到了i-3年還是小牛, //那麼毫無疑問,這種青年小牛會在第i年之前成長為母牛,可是 //在i-3到i年間假設青年小牛成長為母牛,那麼母牛會馬上生仔,但是仔在第i年時肯定也是仔 //所以說青年小牛的仔來不及變成母牛,那麼i-3年時x個青年小牛 //到第i年時他會變成x個成年小牛,再帶來新的x個幼年小牛 //如果i-3年時k個幼年小牛,到第i年時他會變成k個成年小牛,再帶來k個幼年小牛 //(小牛剛成熟就可以馬上帶來新的!!!) //而假如i-3年有m個母牛,那麼第i年會帶來m個幼年小牛 //所以如果i-3年時有x+k+m只牛 //i年時則會又多了x+k+m只小牛 //所以a[i]相對於a[i - 1]多了a[i - 3]只牛
#include<bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 101; ll a[maxn] = {0}; int main() { ll n; scanf("%lld", &n); a[1] = 1; //第一年一頭母牛 a[2] = 2; a[3] = 3; a[4] = 4; a[5] = 6; //第二年出生的小牛在第五年變成了母牛,並且馬上生出了一隻小牛 for (ll i = 6
; i <= n; i++) a[i] = a[i - 1] + a[i - 3]; printf("%lld", a[n]); }