题目描述
假设农场中成熟的母牛每年只会生一头小母牛,且永远不会死。第一年农场有1头成熟的母牛,从第二年开始,母牛开始生小母牛,每只小母牛3年之后成熟又可以生小母牛。给定整数N,求N年后牛的数量。
题目解析
分析
举个例子:
- 第1年:
- 有一头成熟的母牛,记为a,总牛数为1
- 第2年:
- a生了新的小母牛,记为b,总牛数为2
- 第3年:
- a生了新的小母牛,记为c
- b只有一岁,不能生
- 总牛数为3
- 第4年:
- a生了新的小母牛,记为d
- b有两岁,c有一岁,不能生
- 总牛数为4
- 第5年:
- a生了新的小母牛,记为e
- b三岁了,成熟了,生下了新的小母牛,记为f
- c有两岁,e有一岁,不能生
- 总牛数为6
- 第6年:
- c也成熟了,a、b、c分别生了一只,总数为9
- 第6年:
- d也成熟了,a、b、c、d分别生了一只,总数为9+4
- d也成熟了,a、b、c、d分别生了一只,总数为9+4
分析:
- 设f(n)为n年后牛的数量,则第n年牛的来源有两个
- 首先,牛是永远不会死的,所以第n-1的牛都会活到第n年
- 其次,还有一部分新生的牛,因为每只小牛3年之后成熟才可以生小牛,所以第n-3年的未成熟的小牛到了第n年会成熟而且开始生小母牛
- 所以第n年新生的牛来自于第n-3年的未成熟小母牛和成熟母牛。
- 综上:
- 递推公式:f(n) = f(n-1) + f(n-3)
- base case:f(1)=1,f(2)=2,f(3)=3
实现
class Solution {
public:
int process(int n) {
if(n == 1 || n == 2 || n == 3){
return 1;
}
return process(n - 1) + process(n - 3);
}
};