看这篇文章前需要看下前面三篇文章,最起码第一第二篇是需要看一下的

斐波那契数列数列相关简化1_鱼跃鹰飞的博客-CSDN博客

斐波那契数列数列相关简化2_鱼跃鹰飞的博客-CSDN博客

斐波那契数列数列相关简化3_鱼跃鹰飞的博客-CSDN博客

算法玩的就是套路,练练就熟悉了

再来一个:

用1*2的瓷砖,把N*2的区域填满

返回铺瓷砖的方法数

这题一看也有些懵逼,我先画个图:

哈哈,图简单吧,但是我想说什么你应该是懂的

如果第一块砖竖着铺,那后面n-1的区域使用黑盒方法选择同样的方法算数量就好了

如果第一块横着铺,那第二块只能横着铺,后面的区域就剩下n-2了,同样使用黑盒方法计算数量就好了

下面是递归的方法:

/*** 黑盒递归方法,返回剩余n*2块的区域能铺满的方法数* @param n* @return*/public static int ways(int n) {if(n < 1) return 0;if(n == 1 || n == 2) return n;//第一种:n里面的第一块横着铺,第二块也没得选,只能横着铺int p1 = ways(n - 2);//第二种:n里面的第一块竖着铺,第二块开始的n-1块可以随意选择int p2 = ways(n -1);//第一块横着和第一块竖着肯定是不同的方法,加一起return p1 + p2;}

分析这个过程不难发现,这也是没有条件的严格位置依赖,符合我们第二篇文章中说的优化条件

依然是二阶矩阵,别的不多说了,上代码吧:

package dataStructure.fibonacci;import static dataStructure.fibonacci.FibonacciStandard.matrixPower;
import static dataStructure.fibonacci.FibonacciStandard.product;/*** 用1*2的瓷砖,把N*2的区域填满** 返回铺瓷砖的方法数*/
public class UseTileFullfill {/*** 黑盒递归方法,返回剩余n*2块的区域能铺满的方法数* @param n* @return*/public static int ways(int n) {if(n < 1) return 0;if(n == 1 || n == 2) return n;//第一种:n里面的第一块横着铺,第二块也没得选,只能横着铺int p1 = ways(n - 2);//第二种:n里面的第一块竖着铺,第二块开始的n-1块可以随意选择int p2 = ways(n -1);//第一块横着和第一块竖着肯定是不同的方法,加一起return p1 + p2;}/*** 根据类似斐波那契数列的严格推理方式进行变化-使用矩阵的某次方* 时间复杂度O(logN)* @param n* @return*/public static int ways2(int n) {if(n < 1) return 0;if(n == 1 || n == 2) return n;/*//第一种:n里面的第一块横着铺,第二块也没得选,只能横着铺int p1 = ways(n - 2);//第二种:n里面的第一块竖着铺,第二块开始的n-1块可以随意选择int p2 = ways(n -1);//第一块横着和第一块竖着肯定是不同的方法,加一起return p1 + p2;*///根据递归方法算得前1,2,3,4项的结果分别是1,2,3,5//|f(3) f(2)| = |f(2) f(1)| * base//假设base是{{a, b}{c, d}}//|3 2| = |2 1| * base->2a + c = 3 2b + d =2//|5 3| = |3 2| * base->3a + 2c = 5 3b + 2d = 3//通过上面两个方程可以得到a=1, c = 1, b = 1 d = 0int[][] base = {{1,1},{1,0}};int[][] matrix21 = {{2,1}};int[][] matrix = matrixPower(base, n - 2);matrix = product(matrix21, matrix);return matrix[0][0];}public static void main(String[] args) {int n = 6;int ways1 = ways(n);System.out.println(ways1);int ways2 = ways2(n);System.out.println(ways2);}
}

详细注释,方法都是用的以前的类里的,懒得写了,都是一样的,看不懂的私信我。

这个系列的题目先练到这里吧,相信对你已经没有任何挑战了,还想练的话很多递归的题目都能练这个,我再提供一个题目吧:

一个人可以一次往上迈1个台阶,也可以迈2个台阶

返回这个人迈上N级台阶的方法数

斐波那契数列相关简化4相关推荐

  1. 斐波那契数列数列相关简化2

    看这篇文章前先看一下第一篇文章: 斐波那契数列数列相关简化1_鱼跃鹰飞的博客-CSDN博客 根据第一篇文章总结如下: 如果某个递归,除了初始项之外,具有如下的形式 F(N) = C1 * F(N) + ...

  2. Algorithm:【Algorithm算法进阶之路】之算法中的数学编程相关习题(时间速度、进制转换、排列组合、条件概率、斐波那契数列)

    Algorithm:[Algorithm算法进阶之路]之算法中的数学编程相关习题(时间速度.进制转换.排列组合.条件概率.斐波那契数列) 目录 时间速度 排列组合 进制转换 条件概率 斐波那契数列 时 ...

  3. Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题

    ML岗位面试:上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点-斐波那契数列.八皇后问题.两种LCS问题 Interview:算法岗位面试-上海某公司算法岗位(偏机器学 ...

  4. 斐波那契数列兔子繁殖问题相关思考

    斐波那契数列的一个典型应用就是兔子繁殖问题. 一.最朴素的兔子繁殖问题就是:有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问第n个月的兔子总 ...

  5. 青蛙跳台阶问题暨斐波那契数列

    1.问题描述 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 2.问题分析 设 f(n) 表示青蛙跳上 n 级台阶的跳法数.当只有一个台阶时, ...

  6. 斐波那契数列 (Fibonacci) 多种实现方法(Python)与详细介绍

    斐波那契数列 Fibonacci Sequence 本文介绍了多种方式得到斐波那契数列或斐波那契数.斐波那契数列也称为"兔子数列".来源于兔子繁殖的预测.它的重要性体现在相邻两数之 ...

  7. JAVA(4)学习笔记:JVM虚拟机上的栈、大驼峰命名法和小驼峰命名法、实参和形参、重载方法、调用栈、递归练习(汉诺塔+斐波那契数列)、数组的定义、数组的初始化、增强for循环。

    接上次的博客:JAVA学习(3)--知识整理以及一些简单程序(猜数字游戏.求各种自幂数.求出一个数字的二进制位中1的个数.获取一个数二进制序列中所有的偶数位和奇数位.求公约数的多种实现方式.输入密码程 ...

  8. c语言输出斐波那契数列pta,从斐波那契数列说起

    这段时间在看算法相关的一些东西: 因为算法不好连笔试都过不了(哭,其实算法不仅仅是为了笔试面试,更是为了日后在工作中提高软件的运行效率.这让我联想到了前不久看过的一篇文章:李开复:算法的力量 以前没有 ...

  9. 斐波那契数列性质【记住】

    斐波那契数列 斐波那契数列递推 F(1)=1,F(0)=0F(1)=1,F(0)=0F(1)=1,F(0)=0 F(n)=F(n−1)+F(n−2)F(n)=F(n-1)+F(n-2)F(n)=F(n ...

最新文章

  1. 鸿蒙2.0 安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
  2. HTML DOM Element 对象
  3. Big Data Exchange宣布在南京建设数据中心
  4. VsCode 配置 C/C++ 开发环境,真的很简单
  5. lua----------------使用VS2015搭建lua开发环境的一些侥幸成功经验,
  6. [SQL SERVER 2005]数据库差异备份及还原
  7. 开灯关灯java script_Jquery实现视频播放页面的关灯开灯效果
  8. python canvas画移动物体_Python:Tkinter的GUI设计——物体实时移动
  9. 【自我感悟致学弟学妹】大三上的感悟,何为真正优秀的人
  10. xshell部署web项目_前端轻量化部署脚手架实践
  11. David I 盛大之行及Delphi未来畅想
  12. linux 常用分区有哪些,Linux常用分区及目录
  13. 【优化求解】基于matlab蚁群算法求解函数极值问题【含Matlab源码 1201期】
  14. Linux C++线程池框架
  15. 淘宝店铺装修旺铺基础版全屏轮播代码效果1920PX海报
  16. TCP/IP协议号大全
  17. 百度飞桨EasyDL X 韦士肯:看轴承质检如何装上“AI之眼”
  18. 保险行业CRM客户关系管理系统解决方案
  19. 汉字风格迁移篇---个人手写体汉字字体的学习与生成*
  20. python交换数组中的两个元素_Python 交换数组元素

热门文章

  1. mes智能制造管理系统软件
  2. 浅析第三方收款码,固定收款码、收款二维码的未来发展
  3. element 框架 el-upload 上传文件问题
  4. 5-0 Master Academic Research
  5. Win10 家庭版中启用组策略
  6. 萌新的Arduino大作业
  7. python打开文件写文件乱码_Python读写文件乱码问题
  8. 机器学习、人工智能在面相学中的应用
  9. 2021.5.21开始的兔系刷题之路 根据LeetCode分类进行逐个击破 培养出自己的套路~
  10. 我的切图方法最佳实践