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

news2024/11/23 20:39:58

看这篇文章前先看一下第一篇文章:

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

根据第一篇文章总结如下:

如果某个递归,除了初始项之外,具有如下的形式

F(N) = C1 * F(N) + C2 * F(N-1) + … + Ck * F(N-k) ( C1…Ck k都是常数)

并且这个递归的表达式是严格的、不随条件转移的

那么都存在类似斐波那契数列的优化,时间复杂度都能优化成O(logN)

练一个新的题目:

第一年农场有1只成熟的母牛A,往后的每年:

1)每一只成熟的母牛都会生一只母牛

2)每一只新出生的母牛都在出生的第三年成熟

3)每一只母牛永远不会死

返回N年后牛的数量

 

直接上代码吧,里面有详细的注释:

package dataStructure.fibonacci;

/**
 * 第一年农场有1只成熟的母牛A,往后的每年:
 *
 * 1)每一只成熟的母牛都会生一只母牛
 *
 * 2)每一只新出生的母牛都在出生的第三年成熟
 *
 * 3)每一只母牛永远不会死
 *
 * 返回N年后牛的数量
 */
public class HowManyCowsLeft {
    public static int howManyCows(int n) {
        if(n < 1) return 1;
        if(n <= 4) return n;
        //根据枚举找到的规律或者说可以根据满3年可以生孩子进行的推算,f(n-1)是上一年的
        //f(n-3)是3年前的奶牛数量,3年前的今年都可以生小奶牛了
        return howManyCows(n - 1) + howManyCows(n-3);
    }

    public static int howManyCows2(int n) {
        if(n < 1) return 1;
        if(n <= 4) return n;
        //return howManyCows(n - 1) + howManyCows(n-3);
        // 根据我们之前斐波那契数列数量的经验,这个是有严格推理结构的,没有任何条件的推理
        //最多依赖n-3这应该是一个3阶矩阵
        //|f(4) f(3) f(2)| = f|f(3) f(2) f(1)| * {{a,b,c},{d,e,f},{g,h,i}}
        //|4,3,2| = |3,2,1| * {{a,b,c},{d,e,f},{g,h,i}}->3a+2b+c=4 3d+2e+f=3 3g+2h+i=2
        //|f(5) f(4) f(3)| = f|f(4) f(3) f(2)| * {{a,b,c},{d,e,f},{g,h,i}}
        //|6,4,3| = |4,3,2| * {{a,b,c},{d,e,f},{g,h,i}}->4a+3b+2c=6 4d+3e+2f=4 4g+3h+2i=3
        //|f(6) f(5) f(4)| = f|f(5) f(4) f(3)| * {{a,b,c},{d,e,f},{g,h,i}}
        //|9,6,4| = |6,4,3| * {{a,b,c},{d,e,f},{g,h,i}}->6a+4b+3c=9 6d+4e+3f=6 6g+4h+3i=4
        //通过上面三个方程就可以得出a=1,b=0,c=1 d=1, e=0, f=0, g=0, h=1, i = 0
        //也就是说这个问题的base矩阵就是{{1,0,1},{1,0,0},{0,1,0}}
        //|f(n) f(n-1) f(n-2)| = |f(3) f(2) f(1)| * base的n-3次方
        //先求base的n-3次方
        int[][] base = {{1,0,1},{1,0,0},{0,1,0}};
        int[][] matrix = matrixPower(base, n - 3);
        int[][] matrix321 = {{3,2,1}};
        matrix = product(matrix321, matrix);
        return matrix[0][0];
    }

    private static int[][] product(int[][] matrix1, int[][] matrix2) {
        if(matrix1 == null || matrix2 == null || matrix1[0].length == 0 || matrix1[0].length != matrix2.length) {
            return null;
        }
        //n是matrix1的行数
        int n = matrix1.length;
        //m是matrix2的列数
        int m = matrix2[0].length;
        //k是matrix1的列数,这个数同时也等于matrix2的行数
        int k = matrix1[0].length;
        int[][] matrix = new int[n][m];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                matrix[i][j] = 0;
                for(int k1 = 0; k1 < k; k1++) {
                    matrix[i][j] += matrix1[i][k1] * matrix2[k1][j];
                }
            }
        }
        return matrix;
    }

    private static int[][] matrixPower(int[][] base, int q) {
        int[][] matrix = {{1,0,0},{0,1,0},{0,0,1}};
        int[][] t = base;
        for(; q != 0; q >>= 1) {
            if((q & 1) != 0) {
                matrix = product(matrix, t);
            }
            t = product(t, t);
        }
        return matrix;
    }

    public static void main(String[] args) {
        int n = 6;
        int numsOfCows = howManyCows(n);
        System.out.println(numsOfCows);

        int numsOfCows2 = howManyCows2(n);
        System.out.println(numsOfCows2);
    }

}

属于类似的套路,应该比较好理解,欢迎私信交流

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

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

相关文章

泛微 E-Office文件上传漏洞复现(CVE-2023-2523、CVE-2023-2648)

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件&#xff0c;泛微协同办公产品系列成员之一,实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

科普拓视野,逐梦新未来——人工智能研学工作坊

随着科技的发展&#xff0c;人工智能逐渐成为世界热门技术之一&#xff0c;为更好启发服务对象想象力&#xff0c;增强其创新精神和实践能力&#xff0c;让服务对象深入感受科技的发展与魅力&#xff0c;2023年5月20日&#xff0c;在阳泉市未成年人救助保护中心的支持下&#x…

如何使用WordPress作为文档管理和文件管理

您想使用 WordPress 来管理您的文件和文档吗&#xff1f; 您可能有需要与团队其他成员共享的电子表格、图像和其他文档。通过将这些文件上传到 WordPress&#xff0c;您可以轻松地与其他人协作&#xff0c;或者只是将这些文档放在 WordPress 仪表板上&#xff0c;以便轻松访问…

从菜鸟到专家,网络安全工程师必备证书有哪些?

网络空间的竞争&#xff0c;归根结底是人才的竞争。 在2022年网络安全周上&#xff0c;《网络安全人才实战能力白皮书》正式发布。数据显示&#xff0c;到2027年&#xff0c;我国网络安全人员缺口将达327万&#xff0c;而高校人才培养规模仅为3万/年。 那么&#xff0c;如果你…

8.1.0版本ELK搭建,开启xpack认证机制

8.1.0版本ELK搭建&#xff0c;开启xpack认证机制 部署环境安排下载elk安装包服务器环境配置部署elasticsearch配置认证配置客户端加密的http通信修改elastic配置文件 部署kibana部署logstash部署httpd&#xff0c;filebeat配置kibana页面部署grafana配置grafana连接elastic 部署…

C++中的多态,以及多态的实现、以及实现多态的两个特例。

一、 多态是什么&#xff1f; 通俗点说&#xff0c;就是多种形态。具体点就是不同对象完成某种事情&#xff0c;会产生不一样的状态。 举个例子&#xff1a;就好比&#xff1a;买票的时候&#xff0c;普通人、学生、军人等等&#xff0c;他们买票有不同的结果&#xff0c;普通人…

从零搭建完整python自动化测试框架(UI自动化和接口自动化 )

目录 一、总体框架 二、PO模式、DDT数据驱动、关键字驱动 三、框架技术选择 四、框架运行结果 五、各用例对应的定义方式&#xff08;PO/DDT&#xff09; 六、API接口定义方式 七、测试执行结果 从零开始搭建项目 一、开发环境搭建 二、新建项目 三、基础功能实现 …

前两天面了个腾讯28K来的,让我见识到了测试界的天花板

马上又是一年毕业季了&#xff0c;那么去年那一批毕业的应届生怎么样了&#xff1f; 2022年堪称大学生就业最难的一年&#xff0c;应届毕业生人数是1076万。失业率超50%&#xff01; 但是我观察到一个数据&#xff0c;那就是已经就业的毕业生中&#xff0c;计算机通信等行业最…

数据结构(C语言):一元多项式的操作(链表实现)

一、题目 一元多项式的操作 设有两个一元多项式&#xff1a; p(x)p0p1xp2x2pnxn q(x)q0q1xq2x2qmxm 多项式项的系数为实数&#xff0c;指数为整数&#xff0c;设计实现一元多项式操作的程序&#xff1a; ① 多项式链表建立&#xff1a;以&#xff08;系数&#xff0c;指数…

国内最佳的客服系统Tidio替代品是什么?

许多做跨境电商的企业都知道&#xff0c;Tidio是一款不错的为电子商务量身定制的全渠道客服系统支持工具&#xff0c;但还有其他同样不错的选择。 当前许多同类型产品以迎合欧美客户居多&#xff0c;中国用户使用不惯&#xff1b;免费版体验门槛高&#xff1b;只支持海外支付方…

【链路追踪】「Go语言」OpenTelemetry实现[gin, gRPC, log, gorm, redis]的集成

文章目录 一、OpenTelemetry的前世今生OpenTracingOpenCensus大一统 二、OpenTelemetry快速体验go快速体验OpenTelemetry系统架构尾部采样 三、通过http完成span传输函数中传递span的context 四、自定义inject和extract源码五、gRPC集成自用框架集成&#xff08;无视即可&#…

最强chrome、edge的广告拦截插件

最强chrome、edge的广告拦截插件 对于浏览器的广告是非常烦人的&#xff0c;尤其是使用百度搜索引擎时&#xff0c;总会在右侧出现百度热搜这样的东西&#xff0c;有时不经意间就会被某些热搜吸引。本来想搜索一些内容&#xff0c;结果被热搜等耗费了大量时间。 有很多人推荐…

pytorch基础语法学习:数据预处理transforms模块

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 建议搭配视频食用 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6 系列其他文章传送门&#xff1a; pytorch基础语法学习&#xff1a;数据读取机制Dataloader与Datase…

3D点云数据转为俯瞰图Python实现代码

我主要是参考了英文博客来撰写本篇文章&#xff0c;仅作为个人学习笔记参考使用。 文章目录 一、点云数据二、图像与点云坐标三、创建点云数据的鸟瞰视图3.1 鸟瞰图的相关坐标轴3.2 限制点云数据范围3.3 将点位置映射到像素位置3.4 切换到新的零点3.5 像素值3.6 创建图像矩阵3.…

IOS最新版开通GPT-PLUS方法

前提&#xff0c;美国IP魔法 不多说了 1.拥有一个美区apple id账号 可以买&#xff0c;也可以自己申请 自己申请就打开魔法到apple官网注册&#xff0c;用gmail邮箱&#xff0c;然后地址用美国地址生成器&#xff0c;记得选免税州 2.充值礼品卡 支付宝可以充值礼品卡&…

大模型总是「胡说八道」怎么办?手把手教你如何应对!

随着 ChatGPT 的出现&#xff0c;「AI 幻觉」一词被频繁提及。那么&#xff0c;什么是 AI 幻觉&#xff1f;简单来说&#xff0c;就是大模型在一本正经地胡说八道。 不止 ChatGPT&#xff0c;其他大语言模型也经常如此&#xff0c;究其根本是大语言模型在训练的过程中存在数据偏…

驱动开发-----io模型总结(2023-5-23)

1.非阻塞模型 在我们使用open函数时&#xff0c;将打开的驱动设置为O_NONBLOCK时&#xff0c;当我们用read函数去读取硬件数据时&#xff0c;无论硬件是否有数据&#xff0c;都会往下执行&#xff0c;不会被阻塞在这里 2.阻塞模型 在我们使用open函数时&#xff0c;没有设置…

C++学习之路-变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

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

斐波那契数列问题介绍&#xff1a; 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xf…

包管理工具详解npm、yarn、cnpm、npx、pnpm

目录&#xff1a; 1 npm包管理工具 2 package配置文件 3 npm install原理 4 yarn、cnpm、npx 5 发布自己的开发包 6 pnpm使用和原理 当我们使用npm install xxxx 的时候会添加一个node_module和2个json文件&#xff1a; package.json是配置信息文件&#xff0c;  这个配…