2018 (遞推 | 思維水題)
阿新 • • 發佈:2018-12-17
按理說這應該就是一道水題, 可最近實在對遞推的理解有些生疏了, 考慮了很久一直在WA, 其實就是一個變種般的斐波那契數列
分析 根據題意,先列出前幾年的牛頭數,試著找找規律:
在列出這個序列的過程中,應當能找出規律。 以n=6為例,fn=9頭牛可以分解為6+3,其中6是上一年(第5年)的牛,3是新生的牛(因為第3年有3頭牛,這3頭在第6年各生一頭牛)。 我們可以得出這樣一個公式:fn=fn-1+fn-3 再理解一下,fn-1是前一年的牛,第n年仍然在,fn-3是前三年那一年的牛,但換句話說也就是第n年具有生育能力的牛,也就是第n年能生下的小牛數。 程式設計序,求解這個公式就行了。 當然,第1-3年的數目,需要直接給出。 很像斐波那契數列,有不一樣之處,道理、方法一樣。其實,在程式設計之前,講究先用這樣的方式建模。
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn = 60; int cows[maxn], n; void solve(int m) { memset(cows, 0, sizeof(cows)); cows[1] = 1, cows[2] = 2, cows[3] = 3, cows[4] = 4; for(int i = 5; i <= m; i++) cows[i] = cows[i-1] + cows[i-3]; } int main() { solve(55); while(scanf("%d",&n) && n!=0) cout << cows[n] << endl; return 0; }