昨晚的牛客笔试题:兔子繁殖

题目

一对兔子,在第五个月开始繁殖每个月生成一对小兔子,小兔子出生后也是第五个月开始繁殖,第n个月共有多少对兔子?
输入:n
输出:兔子数量

示例

输入:5
输出:2
解释:第五个月,最开始的兔子开始繁殖出第一对小兔子。

输入:9
输出:7
解释:五月繁殖第一对,六月繁殖第二对,七月繁殖第三队,八月繁殖第四对,九月除了祖先兔子繁殖第五对,另外第五个月出生的小兔子也开始繁殖处一对,加起来总共7对。

第n的月的兔子数,是由前一个月的兔子数外加四个月前的兔子数组成的,四个月前有多少只兔子,那么现在这个月就会出生多少对新兔子。

当月兔子数 = 现有兔子数(也就是上一个月的总数) + 新生兔子数(也就是四个月前的,因为四个月前的兔子都已经成熟了)

于是就有 f(n) = f(n-1) + f(n-4)

那么用递归是不是就美滋滋了?

但是!

这道题用递归只能得出 70%,毕竟很慢。
例如:f(9) = f(8) + f(5) = f(7) + f(4) + f(5) = f(6) + f(3) + f(4) + f(5) = f(5) + f(2) + f(3) + f(4) + f(5)
这样就会重复计算 f(5)了,n越大,需要重复计算的就越多,导致时间巨大。
这里需要用到动态规划的思想。用一个数组将计算过的值保存起来,从头开始计算。

	function func(n) {
      let arr = [1,1,1,1];
      if (n < 5) {
        return 1;
      }
      for (let i = 4; i < n; i++) {
        arr[i] = arr[i-1] + arr[i-4];
      }
      return arr[n - 1];
    }

PS:牛客上不是写函数,而是:

const n = parseInt(readline()); // 输入 readline()
...
...
...
print(num); // 输出 print()
全部评论

相关推荐

新记话事人:你就和她说去抖音了
点赞 评论 收藏
分享
神哥了不得:放平心态,再找找看吧,主要现在计算机也变卷了,然后就比较看学历了,之前高中毕业你技术强,都能找到工作的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务