数据结构-返回n年后牛的数量

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

  1. 每一只成熟的母牛都会生一只母牛
  2. 每一只新出生的母牛都在出生的第三年成熟
  3. 每一只母牛永远不会死

返回N年后牛的数量。

抽象公式就是 F(N) = F(N-1) + F(N-3).

矩阵公式:

|F4, F3, F2| = |F3,F2,F1| * 3阶矩阵

|F5, F4, F3| = |F4,F3,F2| * 3阶矩阵

|F6, F5, F4| = |F5,F4,F3| * 3阶矩阵

通过3个公式求出3阶矩阵

java 复制代码
public class FibonacciProblem {
    public static void main(String[] args) {
        // 1,1,2,3,5,8,13
        int n = 19;
        System.out.println(c1(n));
        System.out.println(c3(n));

    }

    // 递归解
    public static int c1(int n){

        if (n < 0){
            return 0;
        }

        if (n == 1 || n == 2 || n == 3){
            return n;
        }

        return c1(n-1) + c1(n-3);
    }

    // 矩阵解
    public static int c3(int n){
        if (n < 1){
            return 0;
        }

        if(n == 1 || n == 2){
            return 1;
        }

        int[][] base = {
                {1,1,0},
                {0,0,1},
                {1,0,0}
        };

        int[][] res = matrixPower(base, n-3);

        //|F3,F2,F1| * (3阶矩阵的n-3次方)
        return 3*res[0][0] + 2*res[1][0] + res[2][0];
    }

    public static int[][] matrixPower(int[][] m, int p){
        int[][] res = new int[m.length][m[0].length];

        for (int i = 0; i < res.length; i++) {
            res[i][i] = 1; // 对角线
        }

        // res=矩阵中的1
        int[][] t = m; // 矩阵1次方
        for (; p != 0; p >>= 1){
             if((p&1) != 0){
                res = mulMatrix(res, t);
             }

             t = mulMatrix(t,t);
        }

        return res;
    }

    // 两个矩阵相乘.  第一个矩阵的行数等于第二个矩阵的列数
    public static int[][] mulMatrix(int[][] m1, int[][] m2){
        int res[][] = new int[m1.length][m2[0].length];
        for (int i = 0; i < m1.length; i++) {
            for (int j = 0; j < m2[0].length; j++) {
                for (int k = 0; k < m2.length; k++) {
                    res[i][j] += m1[i][k] * m2[k][j];
                }
            }
        }
        return res;
    }
}
相关推荐
一个爱编程的人3 小时前
一个数是不是素数
数据结构·算法
忡黑梨3 小时前
eNSP_从直连到BGP全网互通
c语言·网络·数据结构·python·算法·网络安全
地球资源数据云4 小时前
1900-2023年中国物种分布点位矢量数据集
大数据·数据结构·数据库·数据仓库·人工智能
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第20题:HashMap在计算index的时候,为什么要对数组长度做减1操作
java·开发语言·数据结构·后端·面试·哈希算法·hash-index
牢姐与蒯5 小时前
cpp数据结构之map
数据结构
故事和你915 小时前
洛谷-算法2-3-分治与倍增5
开发语言·数据结构·c++·算法·动态规划·图论
北顾笙9805 小时前
day37-数据结构力扣
数据结构·算法·leetcode
liuyao_xianhui6 小时前
进程概念与进程状态_Linux
linux·运维·服务器·数据结构·c++·哈希算法·宽度优先
如君愿6 小时前
考研复习 Day 26 | 习题--计算机网络第三章(数据链路层 下)、数据结构 多维数组与广义表
数据结构·计算机网络·考研·记录考研
bqq198610266 小时前
MySQL分库分表
数据结构·mysql