斐波那契数列相关简化4

news2025/1/25 9:08:58

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

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

斐波那契数列数列相关简化2_鱼跃鹰飞的博客-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 = 0
        int[][] 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级台阶的方法数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在 CentOS Linux 上安装和配置 DRBD?实现高可用性和数据冗余

DRBD&#xff08;Distributed Replicated Block Device&#xff09;是一种用于实现高可用性和数据冗余的开源技术。它允许在不同的服务器之间实时同步数据&#xff0c;以提供数据的冗余和容错能力。本文将详细介绍如何在 CentOS Linux 上安装和配置 DRBD。 1. 确认系统要求 在…

一文带你了解MySQL之InnoDB统计数据是如何收集的

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 我们前边唠叨查询成本的时候经常用到一些统计数据&#xff0c;比如通过show table status可以看到关于表的统计数据&#xff0c;通过show index可以看到关于索引的统计数据&#xff0c;那…

MySQL之事务初步

0. 数据源 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80016Source Host : localhost:3306Source Schema : tempdbTarget Server Type : MySQLTarget Server Version…

在线OJ常用输入规则

一、字符串输入规则 1.1 单行无空格字符串输入 输入连续字符串&#xff0c;cin默认空格/换行符为分割标志。 string s; //输入连续字符串&#xff0c;cin默认空格/换行符为分割标志。 cin >> s; 1.2 单行有空格字符串输入 getline函数接受带有空格的输入流&#xff…

C++——初识模板

文章目录 总述为什么要有模板函数模板概念函数模板使用方法函数模板的原理函数模板的实例化隐式示例化显式实例化 模板参数的匹配规则 类模板类模板的实例化 总述 本篇文章将带大家简单的了解一下c的模板方面的知识&#xff0c;带大家认识什么是模板&#xff0c;模板的作用&…

STL-常用算法(一.遍历 查找 排序)

目录 常用遍历算法&#xff1a; for_each和transform函数示例&#xff1a; 常用查找算法&#xff1a; find函数示例&#xff1a; find_if函数示例&#xff1a; adjacent_find示例&#xff1a; binary_search函数示例&#xff1a; count函数示例&#xff1a; count_if函…

训练/测试、过拟合问题

在机器学习中&#xff0c;我们创建模型来预测某些事件的结果&#xff0c;比如之前使用重量和发动机排量&#xff0c;预测了汽车的二氧化碳排放量 要衡量模型是否足够好&#xff0c;我们可以使用一种称为训练/测试的方法 训练/测试是一种测量模型准确性的方法 之所以称为训练…

springmvc升级到springboot2踩的坑

声明:删除springmvc的jar配置改成springboot的&#xff0c;若别的组件依赖springboot该升级就升级&#xff0c;该删掉就删掉&#xff0c;此文章只记录升级后的坑&#xff0c;升级springboot所需的jar请自行百度。 一.Hibernate的坑 概念:jpa和Hibernate的关系&#xff0c;jpa…

【JAVAEE】网络编程的简单介绍及其实现

目录 1.什么是网络编程 网络编程中的基本概念 常见的客户端服务端模型 2.Socket套接字 Socket套接字分类 举例对比TCP和UDP 3.UDP数据报套接字编程 DatagramSocket API DatagramPacket API InetSocketAddress API 4.实现一个简单的UDP回显服务器与客户端 服务端与客…

当前最新免费使用GPT-4方法汇总

目录 前言 温馨提示 Ora AI 使用方式 使用测试 Forefont chat 使用方式 使用测试 Perplexity AI 使用方式 使用测试 Poe 总结 前言 目前GPT-4的收费对于大多数人而言都还是不便宜&#xff0c;且付费方式复杂&#xff0c;使用上还有每3小时25个问题的限制&#xff…

Aspose.OCR For NET 23.5 Crack

使用几行代码将光学字符识别 (OCR) 添加到您的 .NET 应用程序。 适用于 .NET 的 Aspose.OCRAspose.OCR 文档 Aspose.OCR for .NET 是一个功能强大但易于使用且具有成本效益的光学字符识别 API。有了它&#xff0c;您可以用不到 5 行代码将 OCR 功能添加到您的 .NET 应用程序…

【Linux】初识优雅的Linux编辑器——Vim

❤️前言 大家好&#xff01;今天给大家带来的博客内容是关于Linux操作系统下的一款多模式文本编辑器Vim。本文将和大家一起来了解Vim编辑器的一些基础知识。 正文 Vim是一个多模式的文本编辑器(一共有十二种模式)&#xff0c;其中我们当我们初学Vim时主要了解如下三种工作模式…

Linux——多线程(线程概念|进程与线程|线程控制)

目录 地址空间和页表 如何看待地址空间和页表 虚拟地址如何转化到物理地址的 线程与进程的关系 什么叫进程&#xff1f; 什么叫线程&#xff1f; 如何看待我们之前学习进程时&#xff0c;对应的进程概念呢&#xff1f;和今天的冲突吗&#xff1f; windows线程与linux线…

Leetcode665. 非递减数列

Every day a Leetcode 题目来源&#xff1a;665. 非递减数列 解法1&#xff1a;贪心 本题是要维持一个非递减的数列&#xff0c;所以遇到递减的情况时&#xff08;nums[i] > nums[i 1]&#xff09;&#xff0c;要么将前面的元素缩小&#xff0c;要么将后面的元素放大。 …

K8s in Action 阅读笔记——【2】First steps with Docker and Kubernetes

K8s in Action 阅读笔记——【2】First steps with Docker and Kubernetes 2.1 Creating, running, and sharing a container image 2.1.1 Installing Docker and running a Hello World container 在电脑上安装好Docker环境后&#xff0c;执行如下命令&#xff0c; $ dock…

真会玩:莫言用ChatGPT为余华写了一篇获奖词

5月16日&#xff0c;《收获》杂志65周年庆典暨新书发布活动在上海舞蹈中心举行。 典礼现场&#xff0c;余华凭借《文城》获得收获文学榜2021年长篇小说榜榜首。 作为老友&#xff0c;莫言在颁奖时故意卖了个关子&#xff1a;“这次获奖的是一个了不起的人物&#xff0c;当然了&…

OMA通道-2

1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE&#xff0c;例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图&#xff0c;以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间&#xff0c;则它应为 org.simalliance.openmob…

Foxit PDF SDK OCR Add-on Library (C++, Windows)-Crk

OCR文档扫描--Crack version 使用Foxit PDF SDK OCR Add-on的光学字符识别&#xff08;OCR&#xff09;软件将扫描的文档转换为可搜索的文本PDF。专为扫描、归档和数字化而设计&#xff0c;我们的插件输出13种不同的文件格式&#xff0c;包括PDF和PDF/A。 在不投资数据输入人员…

Linux 禁用23端口

禁用23端口 前言 23端口是用于Telnet服务的默认端口。Telnet是一种早期的网络协议&#xff0c;允许用户使用一个远程终端连接到远程计算机上&#xff0c;以便在远程计算机上执行命令和操作。通过输入用于Telnet服务器的IP地址和端口号&#xff0c;用户可以在本地计算机上打开一…

【Java|golang】1090. 受标签影响的最大值---关联数组排序问题以及切片排序失败

我们有一个 n 项的集合。给出两个整数数组 values 和 labels &#xff0c;第 i 个元素的值和标签分别是 values[i] 和 labels[i]。还会给出两个整数 numWanted 和 useLimit 。 从 n 个元素中选择一个子集 s : 子集 s 的大小 小于或等于 numWanted 。 s 中 最多 有相同标签的 …