有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第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]); }