题目源头

这道题目是前些日子,面试阿里的时候,给的一道在线测评算法题

题目描述

大海中央的一座孤岛,上面本来没有老鼠。有一艘路过的船只在附近沉没了,船上 x 对 新出生的老鼠,顺着船只残骸漂流到小岛上。
1. 每两个月一次生产,每次出生 2对 老鼠
2. 老鼠的寿命是 5个月,也就是说一辈子可以生产 2次
3. 这个岛上,每个月因为神秘原因,假如存在 3个月大的老鼠,会死去一对问 n个月后,岛上有多少只老鼠 (假设存活率 100% )

解题思路

1

  • 如果只看第一个条件,颇有一点斐波那契数列的样子。但是这个题目,老鼠不是单纯的生,还有死、意外死,还有生的限制

2

  • 进一步,可以看到,这个题目似乎老鼠是有几个状态的:新生的老鼠,意外死亡,正常死亡的老鼠等
  • 最开始在想,是不是可以存在几个状态转移方程,譬如fn=nx,n个月时该状态下的老鼠数量,多个状态转移与岛上的老鼠有什么关系,去寻找这种关系
  • 但是,想了一会儿,发现这种思路,偏复杂,比如意外死亡是需要考虑老鼠的年龄的,并不是单纯的将现存的老鼠直接-1就可以的,必须是年龄到3个月的时候才可-1。那就说明,这种状态方程计算数目的时候,必须要引入老鼠的年龄的概念。
  • 这里的动态转移方程:已经想到这个题目应该是可以利用动态规划的思想去解决的

3

  • 从老鼠年龄的角度出发,记录不同的月份的老鼠的有多少只,岛上的老鼠数目,就是当前n个月,不同月份的老鼠数目和

思路图解

  • 下文提到的如(1,2)表示,1个月后,年龄为2两个月的老鼠数目

0个月时


其实就是新生老鼠来到岛上的时候,只存在x只新生的老鼠

1个月时

  • 约束:

    • (1,1)的老鼠,只能由0个月时的0个月的老鼠(0,0)成长而来,计算时候只需要考虑(0,0)格子(当前月份的老鼠,只能由上一个月的老鼠成长而来)
    • 同理,(1,2)有(0,1)
    • 没有新生,(1,0)为0

2个月时

  • 约束:

    • 岛上开始出现2个月的老鼠(1,1)经过1个月的成长具备生育能力,(2,0)为2*(1,1)

3个月时

  • 约束:

    • 岛上开始出现3个月的老鼠,出现意外死亡,(3,3)=(2,2)-1
    • (3,0)为0,因为(2,1)为0,不存在具备生育能力的老鼠
    • (3,1),(3,2)分别由(2,0),(2,1)成长而来

4个月时

  • 约束:

    • (3,3)经过一个月的成长,又具备生育能力了(每两个月),因此(4,0)=2*(3,1)+2*(3,3)

5个月时

  • 约束:

    • 正常死亡,(5,5)由(4,4)成长而来,但是会死亡,所以(5,5)为0
    • 其实这个状态是可以没有的,因为(n,5)恒为0,不存在5个月的老鼠,但是这里为了体现死亡状态,特地把这一行写出来

状态转移方程

得出状态转移方程

  • 0个月 f0(n) = 2f1(n-1)+2f3(n-1) //1个月,3个月的老鼠剩余

  • 1个月 f1(n) = f0(n-1) //0个月的老鼠成长

  • 2个月 f2(n) = f1(n-1) //1个月的老鼠成长

  • 3个月 f3(n) = f2(n-1)-1 假设f2(n-1)>0 //2个月的老鼠成长,意外死亡1对

  • 4个月 f4(n) = f3(n-1) //3个月的老鼠成长

  • 5个月 f5(n) = 0 //4个月成长的老鼠,死亡

  • 总的老鼠:total[n] = f0+f1+f2+f3+f4+f5

// f0(n) n个月时,0个月的老鼠有几只
// 从上面其实可以看出,再强调一次,第n个月老鼠数目,只与n-1个月时的不同月份的老鼠有关(后面代码优化的时候会用到的)

一个二维数组记录n+1行,6列,行数表示当前时间,列数表述当前n个月,不同年龄的老鼠array[n+1][6]


0个月时,[x,0,0,0,0,0]
1个月时,根据array[0]进行计算
2个月时,根据array[1]进行计算
3个月时,根据array[2]进行计算
.....
  • **总的老鼠:total[n] = array[n][0]+array[n][1]+array[n][2]+array[n][3]+array[n][4]+array[n][5]

空间复杂度优化

  • 其实,思路解析到这里,如果有接触过01背包问题的同学,已经感觉到非常熟悉了,01背包问题的优化,最后会有存在对空间复杂度的优化
  • 这里用二维数组进行记录,array[n]的状态,只跟array[n-1]有关,其实不需要O(n)的空间复杂度的
  • 只需要array[2][6]的数组即可!
0个月时,[x,0,0,0,0,0]
1个月时,根据array[0]进行计算(跟前面一样)2个月时,根据array[1]进行计算,记录在array[0](因为,原先的array[0]已经成长为array[1]了,array[0]已经是废弃数据了,因此原先的array[2]数据可以记录在array[0],上一个月数据就是array[1])3个月时,根据array[0]进行计算,记录在array[1]
.....

实际写代码的时候,只要当前月份除2取余数,得出记录月份以及上一月的计算基础

代码

  • 阿里的测评,对面试者,并没有类似leetcode提交代码,看是否ac。而是给出思路,手写代码。所以这边只提供思路,不提供解题代码~(其实,上面的分析,理解完,代码已经非常清晰了)
  • 我自己用js将上面的状态转移方程呈现出来,以及考虑优化,代码在50行以内
  • 大家可以用自己熟悉的语言写写看

last

不清楚上面是否有遗漏的case,欢迎交流,提供不一样的解题思路~

一道关于老鼠繁衍的算法题相关推荐

  1. 一道让你拍案叫绝的算法题

    这是一道看完答案会觉得很简单,但做之前很难想到答案的题目!!! 不信? Let us go ! 题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次 ...

  2. 一道解决的非常漂亮的算法题

    这是多年以前做的一道题目,原题来自软件报或者电脑报 ,我记不清了.解决这个题目有一个关键的步骤,就是要求一个整数在一个整数三角阵中的坐标.这篇blog就是讨论这个求坐标的问题,不是讨论那个报纸上的题目 ...

  3. 一道很简单的贪心算法题~【贪心:我不要脸的伐?】

    文章目录 题目描述 输入 输出 样例输入 样例输出 C语言代码实现 思路 排序 处理 完整代码 C++代码实现 排序 完整代码 彩蛋 题目描述 小健有一家自己的商店,主营牛奶饮品,最近资金紧张,他想以 ...

  4. 一道求因子之和面试算法题

    package com.project;/*一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程 找出1000以内的所有完数.(因子:除去这个数本身的其它 ...

  5. 前面问的老鼠找奶酪 算法题的js实现代码

    这是一个迷宫问题,在一个二维矩阵中寻找从起点到终点的最短路径,其中矩阵中的障碍物需要被躲避. 下面是一个示例代码: let grid = [[1, 0, 1, 1, 1],[1, 0, 1, 0, 1 ...

  6. 力扣高频算法php_互联网公司最常见的面试算法题有哪些?

    很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么?你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 你在面试的时候,卡壳了,一时间忘了怎么 ...

  7. 如何出(改编)一道ACM算法题?

    本文背景 本人算法能力一般,但是为省赛和区域赛网络赛出过几道题,总结了一些自己的经验,希望与大家分享.本文不涉及具体的算法题,都是一些理论性的想法和一些建议. 题源 如果你能在没有题源的情况下自己想出 ...

  8. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  9. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

最新文章

  1. 神经网络模型中class的forward函数何时调用_用Keras从零开始6步骤训练神经网络
  2. [OS复习]操作系统综述1
  3. SpringBoot 自定义Banner
  4. Linux uptime 命令详解
  5. 深度思考的能力,决定了你能走多远
  6. 一个超轻量级工作流引擎:Workflow-Core
  7. tortoisesvn创建部署项目_FrameWork如何进行云托管部署
  8. How to Simulate the Price Order or Price Line Function using API QP_PREQ_PUB.PRICE_REQUEST Includes
  9. python变量的数据类型
  10. 全球Top 1000计算机科学家h指数公布,中国顶尖计算机科学家人数进入前三
  11. 【机器学习】Matlab中实现QQ-plot的一个好工具gqqplot
  12. 关闭迅雷更新到新版本的提示
  13. 数学实验matlab韩明版答案,数学实验(MATLAB版)[韩明,王家宝,李林 编著] 2012年版...
  14. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Ro A. In Search of an Easy Proble
  15. c600 raid linux,华硕Z9PA-D8 (-C600 INTEL RAID)主板驱动3.8.0.1108版下载,适用于Win8-64,win7,Win7-64,winxp-驱动精灵...
  16. BP神经网络学习与代码预演
  17. 用IF公式实现向上取整的结果
  18. SpyNote的APK无法运行的问题
  19. 氨基-八聚乙二醇Amino-PEG8-alcohol,352439-37-3
  20. Mac 关闭 Adobe Creative Cloud

热门文章

  1. L2TP详解(四)——LAC自动拨号隧道和会话建立过程
  2. 维基解密创始人被指控与匿名者LulzSec黑客组织合作
  3. 关于FPS透视原理的研究(一)
  4. [转]中国最大的Webshell后门箱子调查,所有公开大马全军覆没
  5. 综述:基于图学习的推荐系统;论文笔记
  6. Thunder for Mac: 迅雷下载记录保存文件etm_task_store.dat.mac的解析 【更新】
  7. 移动广告效果监测,App推广广告投放归因工具
  8. 研发效能怎么分析?方法论、模型、误区都在这里了
  9. 初学者学习编程大概需要多久精通
  10. 深度解析|硬盘协议大全,终于搞明白SCSI、IDE、FC、SATA……