斐波那契数列相关简化4
看这篇文章前需要看下前面三篇文章,最起码第一第二篇是需要看一下的
斐波那契数列数列相关简化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相关推荐
- 斐波那契数列数列相关简化2
看这篇文章前先看一下第一篇文章: 斐波那契数列数列相关简化1_鱼跃鹰飞的博客-CSDN博客 根据第一篇文章总结如下: 如果某个递归,除了初始项之外,具有如下的形式 F(N) = C1 * F(N) + ...
- Algorithm:【Algorithm算法进阶之路】之算法中的数学编程相关习题(时间速度、进制转换、排列组合、条件概率、斐波那契数列)
Algorithm:[Algorithm算法进阶之路]之算法中的数学编程相关习题(时间速度.进制转换.排列组合.条件概率.斐波那契数列) 目录 时间速度 排列组合 进制转换 条件概率 斐波那契数列 时 ...
- Interview:算法岗位面试—上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点—斐波那契数列、八皇后问题、两种LCS问题
ML岗位面试:上海某公司算法岗位(偏机器学习,互联网金融行业)技术面试考点之数据结构相关考察点-斐波那契数列.八皇后问题.两种LCS问题 Interview:算法岗位面试-上海某公司算法岗位(偏机器学 ...
- 斐波那契数列兔子繁殖问题相关思考
斐波那契数列的一个典型应用就是兔子繁殖问题. 一.最朴素的兔子繁殖问题就是:有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问第n个月的兔子总 ...
- 青蛙跳台阶问题暨斐波那契数列
1.问题描述 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 2.问题分析 设 f(n) 表示青蛙跳上 n 级台阶的跳法数.当只有一个台阶时, ...
- 斐波那契数列 (Fibonacci) 多种实现方法(Python)与详细介绍
斐波那契数列 Fibonacci Sequence 本文介绍了多种方式得到斐波那契数列或斐波那契数.斐波那契数列也称为"兔子数列".来源于兔子繁殖的预测.它的重要性体现在相邻两数之 ...
- JAVA(4)学习笔记:JVM虚拟机上的栈、大驼峰命名法和小驼峰命名法、实参和形参、重载方法、调用栈、递归练习(汉诺塔+斐波那契数列)、数组的定义、数组的初始化、增强for循环。
接上次的博客:JAVA学习(3)--知识整理以及一些简单程序(猜数字游戏.求各种自幂数.求出一个数字的二进制位中1的个数.获取一个数二进制序列中所有的偶数位和奇数位.求公约数的多种实现方式.输入密码程 ...
- c语言输出斐波那契数列pta,从斐波那契数列说起
这段时间在看算法相关的一些东西: 因为算法不好连笔试都过不了(哭,其实算法不仅仅是为了笔试面试,更是为了日后在工作中提高软件的运行效率.这让我联想到了前不久看过的一篇文章:李开复:算法的力量 以前没有 ...
- 斐波那契数列性质【记住】
斐波那契数列 斐波那契数列递推 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 ...
最新文章
- 鸿蒙2.0 安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪
- HTML DOM Element 对象
- Big Data Exchange宣布在南京建设数据中心
- VsCode 配置 C/C++ 开发环境,真的很简单
- lua----------------使用VS2015搭建lua开发环境的一些侥幸成功经验,
- [SQL SERVER 2005]数据库差异备份及还原
- 开灯关灯java script_Jquery实现视频播放页面的关灯开灯效果
- python canvas画移动物体_Python:Tkinter的GUI设计——物体实时移动
- 【自我感悟致学弟学妹】大三上的感悟,何为真正优秀的人
- xshell部署web项目_前端轻量化部署脚手架实践
- David I 盛大之行及Delphi未来畅想
- linux 常用分区有哪些,Linux常用分区及目录
- 【优化求解】基于matlab蚁群算法求解函数极值问题【含Matlab源码 1201期】
- Linux C++线程池框架
- 淘宝店铺装修旺铺基础版全屏轮播代码效果1920PX海报
- TCP/IP协议号大全
- 百度飞桨EasyDL X 韦士肯:看轴承质检如何装上“AI之眼”
- 保险行业CRM客户关系管理系统解决方案
- 汉字风格迁移篇---个人手写体汉字字体的学习与生成*
- python交换数组中的两个元素_Python 交换数组元素