1. 程式人生 > >2018 (遞推 | 思維水題)

2018 (遞推 | 思維水題)

按理說這應該就是一道水題, 可最近實在對遞推的理解有些生疏了, 考慮了很久一直在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;
}