NJU-高级算法-牛繁殖问题

母牛的故事(C语言) c语言每日小题一练 阅读详情

Description

Cows in the FooLand city are interesting animals. One of their specialties is related to producing offsprings. A cow in FooLand produces its first calve (female calf) at the age of two years and proceeds to produce other calves (one female calf a year).

Now the farmer Harold wants to know how many animals would he have at the end of N years, if we assume that none of the calves die, given that initially, he has only one female calf?

explanation:At the end of 1 year, he will have only 1 cow, at the end of 2 years he will have 2 animals (one parent cow C1 and other baby calf B1 which is the offspring of cow C1).At the end of 3 years, he will have 3 animals (one parent cow C1 and 2 female calves B1 and B2, C1 is the parent of B1 and B2).At the end of 4 years, he will have 5 animals (one parent cow C1, 3 offsprings of C1 i.e. B1, B2, B3 and one offspring of B1).

Input

The first line contains a single integer T denoting the number of test cases. Each line of the test case contains a single integer N as described in the problem.

Output

For each test case print in new line the number of animals expected at the end of N years modulo 10^9 + 7.

Sample Input 1 

2
2
4

Sample Output 1

2
5

思路

题目大意:第0年有1只母牛A;第1年有1只母牛A;第2年2只母牛A,B(A生的);第3年3只母牛A,B,C(A生的);第4年5只母牛A,B,C,D(A生的),E(B生的)...

若记第N年末有F(N)只母牛,则有递推关系F(N) = F(N-1) + F(N-2),其中F(N-1)表示前一年所有的牛(因为牛不会死亡,所有牛都存活到今年),F(N-2)表示两年前出生的牛今年开始具备繁殖能力,且每头生1只牛。

可以看到这其实是一个斐波那契数列问题。

1.简单的递归

n=0或n=1时,F(n) = 1

n>1时,F(n) = F(n-1) + F(n-2)

代码:

import java.util.Scanner;

public class Main {
    
    /*
     *z递归法
     *z第一年末:一头牛(A)
     *z第二年末:两头牛(A,B(A生了B))
     *z第三年末:三头牛(A,B,C(A生了C))
     *z第四年末:五头牛(A,B,C,D(A生了D),E(B生了E))
     *z第五年末:八头牛(A,B,C,D,E,F(A生了F),G(B生了G),H(C生了H))
     *z...
     *z可以总结出结论:
     *T(N) = T(N - 1) + T(N - 2)
     *T(N - 1)表示前一年所有牛的数量,因为第N年时前一年的所有牛都没死
     *T(N - 2)表示第N年时两年前新出生的牛今年开始具备繁殖能力,从而生出的新牛的数量
     * 
     * */
    private static int cal(int n) {
        if(n == 0) {
            return 1;
        } else if(n == 1) {
            return 1;
        } else {
            return cal(n - 1) + cal(n - 2);
        }
    }

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int cases = Integer.parseInt(sc.nextLine());
		for(int turn = 0; turn < cases; turn++) {
		    int n = Integer.parseInt(sc.nextLine());
		    int res = cal(n);
		    
		    System.out.println(res);
		}
		sc.close();
	}
}

但用递归超时,递归是时间复杂度为O(n)的解法,斐波那契数列还存在一种O(logn)的解法

2.动态规划

参考了:Fibonacci 数列O(logn)解法

递归慢的原因在于重复计算,导致有很多不必要的开销。

采用动态规划,所有值只需要进行一次计算。

斐波那契数列an(n ≥ 0),可以通过矩阵乘法的方式进行递推:

进而可以得到:

而对于求幂运算,暴力累乘时间复杂度为O(n),但可以通过递归进行优化:

a^n = (a^(n/2))^2 * a^(n%2)

这里的n/2是取整,如5/2=2。这样就可以实现相当于二分的效果,时间复杂度为O(logn)。

代码:

import java.util.Scanner;

public class Main {
    
    //两个二维矩阵相乘
    private static long[][] multMartix2_2(long[][] m1, long[][] m2) {
        long[][] res = new long[2][2];
        res[0][0] = m1[0][0] * m2[0][0] + m1[0][1] * m2[1][0];
        res[0][1] = m1[0][0] * m2[0][1] + m1[0][1] * m2[1][1];
        res[1][0] = m1[1][0] * m2[0][0] + m1[1][1] * m2[1][0];
        res[1][1] = m1[1][0] * m2[0][1] + m1[1][1] * m2[1][1];
        
        return res;
    }
    
    //1行2列矩阵乘二维矩阵
    private static long[] multMatrix1_2(long[] m1, long[][] m2) {
        long res[] = new long[2];
        res[0] = m1[0] * m2[0][0] + m1[1] * m2[1][0];
        res[1] = m1[0] * m2[0][1] + m1[1] * m2[1][1];
        
        return res;
    }
    
    //二维矩阵的幂
    private static long[][] powMatrix2_2(long[][] m, long n){
        long[][] res = new long[2][2];
        if(n == 0) {
            res[0][0] = res[1][1] = 1;
            res[0][1] = res[1][0] = 0;
            return res;
        } else if(n == 1) {
            return m;
        } else {
            long[][] half = powMatrix2_2(m, n / 2);
            return multMartix2_2(multMartix2_2(half, half), powMatrix2_2(m, n % 2));
        }
    }
    
    private static long fib(long n) {
        if(n == 0) {
            return 1;
        }
        if(n == 1) {
            return 1;
        }
        //斐波那契数列的递推矩阵为{{0, 1}, {1, 1}}
        long[][] m = {{0, 1}, {1, 1}};
        //斐波那契数列初始两值为1
        long[] m0 = {1, 1};
        long[][] powRes = powMatrix2_2(m, n - 1);
        long[]res =  multMatrix1_2(m0, powRes);
        return res[1];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cases = Integer.parseInt(sc.nextLine());
        for(int turn = 0; turn < cases; turn++) {
            long n = Long.parseLong(sc.nextLine());
            long res = fib(n);
            
            System.out.println(res);
        }
        sc.close();
    }
}

 

C语言关于母牛问题的计算代码 【问题描述】 x年出生的母牛从第x+m年开始到第x+n年止(含, 1 < m < n)每年生小母牛一头,并在第x+p(n < p 0)年存栏母牛多少头。 【输入形式】 从标准输入上顺序读入正整数m、n、p、k。 【输出形式】 以整数方式在标准输出上输出第k年的母牛存栏数s。 【输入样例】 3 5 7 12 【输出样例】 27 立即下载

相关推荐

母牛生小牛的C语言算法

roblem 2 母牛生小牛问题 设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛? Input 本题有多组数据。每组数据只有一个整数N,独占一行。(1≤N≤50) Output 对每组数据,输出一个整数(独占一行)表示第N年时母牛的数量 Sample Input 1 4 5 20 Sample Output 1 2 3 872

母牛问题

Description 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛? Input 输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0 n=0表示输入数据的结束,不做处理。 Output 对于每个测试实例,输出在第n年的时候母牛的数量。 每个输出占一行。

明朗晨光的专栏 3261

母牛繁殖问题

NULL 博文链接:https://justsee.iteye.com/blog/1330092

C语言 母牛生小牛问题 多组测试数据

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

qq_45234177的博客 8275

c++:母牛生小母牛问题(递归)

问题描述: 设有一头小母牛,从出生第四年起每年生一头小母牛, 按此规律,第N年时有几头母牛?

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(上)

本文深入解析了AM32电调固件的源码架构与核心模块实现。文章首先介绍了AM32电调作为开源无人机;动力心脏的重要地位,随后从硬件基础、源码目录、模块划分三个维度构建解析框架。重点剖析了系统初始化模块的时钟配置、GPIO初始化和定时器设置,以及FOC控制模块的坐标变换算法、角度估算和SVPWM生成等关键技术实现。通过逐行代码解析,揭示了电调如何将飞控指令转换为电机驱动的完整过程,为开发者理解AM32电调工作原理提供了系统性指导。

bother3000的博客 6567

面向对象程序设计|母牛生小牛问题(静态数据成员与静态成员函数)

C++学习记录之静态数据成员与静态成员函数思考题

2203_75720729的博客 1012

无需上下文,MCP新机制让大模型主动“提需”:节约 98% token 开销,并保持准确率基本不变!

值得注意的是,MCP 协议定义的服务器描述通常较为简洁。为了提升匹配效果,我们引入 Qwen2.5-72b-Instruct 模型,对所有服务器的原始资料(通常为 ReadMe 文档)进行总结提炼,参考其 capabilities、features、usage patterns 等要素,生成服务器的 summary 信息,作为相对详尽的描述文本用于匹配。然而,现有的 MCP 调用机制下,所有工具的描述信息都被注入大模型的系统提示词,导致了非常长的上下文开销,也为大模型的表现带来了影响,降低了模型的性能。

我爱计算机视觉 1174

蓝桥杯专题-真题版含答案-【基因牛的繁殖】【黄金分割数】【振兴中华】【圆周率与级数】

有真题,有答案,认认真真阅读,轻轻松松通过。蓝桥在等你。 有什么需要欢迎文章底部卡片私我,获取更多支持,交流让学习不再孤单

空名先生 1099

转录组数据去批次方法整理(combat,combat-seq,removeBatchEffect)

正是因为这些非生物学的因素存在就有可能会导致我们的结果偏离真实的情况,那么实际分析的过程中研究者应当评估是否存在批次效应,并决定是否要进行去批次处理。批次效应是指样本在不同批次处理及测量的情况下引入与生物学情况不相关的技术误差,比如不同试剂耗材,不同操作者,不同的实验时间等。combat函数是基于贝叶斯框架下的调整数据批次效应的函数,主要适用于已经被过滤和标准化后的数据(combat-seq函数是基于二项回归分布下的调整数据批次效应的函数,主要适用于。值得注意的是,即使使用了所谓的去批次效应的工具,

zfyyzhys的博客 7862

告别手动脚本!用TSMaster Python小程序5分钟搞定CAN报文自动发送

本文介绍了如何使用TSMaster的Python小程序功能快速实现CAN报文自动发送,大幅提升汽车电子测试效率。通过简洁的Python代码示例,展示了如何替代传统手动操作和复杂C脚本,实现周期性发送、动态修改报文内容等常见需求,帮助工程师5分钟内完成自动化配置。

weixin_30292843的博客 512

【C++】递归 -- 母牛生子问题

问题描述 某农场有一头刚出生的小奶牛,从第四个年头开始每年生一头母牛。之后的每一年大奶牛都会生一只小奶牛,而每过四年小奶牛就会长成大奶牛,长成大奶牛后又可以生小奶牛。请问 N 年后,此农场一共有多少头牛? 问题分析 这种问题就是典型的递推问题。 我们先搞懂题目意思:从第四个年头开始,即每过三年小母牛就长大成大奶牛,并在第四年年初产下一头小母牛。依次递推。 我们再来看下母牛有几种状态:一岁小奶牛、两岁小奶牛、三岁小奶牛、四岁及以上大奶牛(以下简称为大奶牛),前三种无产仔能力,后一种每年都可产下一头小奶牛。 之

康娜的博客 1万+

SPWM波调制度原理

SPWM波调制度原理

qq_43557686的博客 1万+

牛的繁殖数c语言,C语言解决母牛繁殖的运算问题

母牛的故事有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?Input输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0n=0表示输入数据的结束,不做处理。Output对于每个测试实例,输出在第n年的时候母牛的数量。每个输出占一行。Sample Input2450Sample Output246#inc...

weixin_39535701的博客 1843

MCU-内部flash模拟成EepRom(重新梳理)

通过fee写数据Data的过程中,数据会mapping一个虚拟地址,这个虚拟地址就是你的身份,在向flash写数据的过程中会写入很多相同虚拟地址的不同数据,在读取或切页的过程中,遍历数据只会认为最下面第一个的虚拟地址所持有的数据是有效数据,其他的都是老数据,可以丢弃。模拟成eeprom的两个eep_page写数据逻辑就是,先在eep_page0写数据,eep_page0写满后,将eep_page0的有效数据copy到eep_page1,之后擦eep_page0;

xiandang8023的博客 711

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1179

母牛生小牛问题

问题:设有一头小母牛,从出生第四年起每年生一头小母牛,按此规律,第N年时有几头母牛? 我看网上有两种解答:1 使用面向对象的方式添加到list中,最后统计list的长度 2 使用f(n) = f(n-1) + f(n-3) 第一种的大家伙很厉害,但是我是用C语言,不适合 第二种网站上的解答要么是直接丢一个公式,要么是用表格把数据列出来找规律。我想要从逻辑上理一下这个公式,所以用这个博客记录一下。 前三年,第一头母牛都还没长大,所以都是1 f(1)=1 f(2)=1 f(3)=1

qq_25260079的博客 2871

手把手带你完成基于UNet的医学图像分割系统设计与实现,UNet网络架构讲解,UNet复现,使用vibe coding工具,开发一个完整系统,包含完整源码

哈喽,大家好,这里是落花不写码,本次教程讲一下 U-Net 分割篇,U-Net 它是一篇 2015 年发表的论文,那为什么到现在还需要讲呢?因为后续讲到 GAN、扩散模型时候是离不开 U-Net 架构的,所以今天先带大家使用 U-Net 模型完成一些图像分割。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 871

c语言牛的繁殖问题思路,C语言母牛问题

问题 F: 母牛问题时间限制: 1 Sec内存限制: 128 MB提交: 94解决: 60[提交] [状态] [讨论版] [命题人:外部导入]题目描述假设单性繁殖成立,若一头母牛,从出生起第四个年头开始,每年生一头母牛,而生出的小母牛在之后的第四年也将具有生殖能力。按此规律,第n年时有多少头母牛?输入输入数据为整数n(1≤n≤40)。输出对于每个n,输出其第n年的母牛数样例输入5 6 7 ...

weixin_36369848的博客 1897

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

兔子繁殖问题

首先读懂题目,知道运算规律后在使用斐波那契数列九很好解决啦 7-26 兔子繁殖问题 (10 分) 已知有一对兔子,每个月可以生一对兔子,而小兔子一个月后又可以生一对小兔子(比如:2月份出生的小兔子4月份可以生育)。也就是说,兔子的对数为:第一个月1对,第二个月2对,第三个月3对,第四个月5对…假设兔子的生育期为两年,且不死。那么问题来了,你能说出每个月的兔子数么? 输入格式: 输入一个数n,...

ice-bear 3872

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

关于C语言母牛生小母牛的题目理解

题目:第一年有一只母牛,母牛在第四年才能生出一只小母牛,并且在以后的每年都生出一只小母牛,问第n年一共有多少头母牛。 这实际上是个递归的问题。第n年的母牛数量实际上就是上一年的数量加上新出生的母牛数量。那么这新出生的母牛数量是多少呢?我们知道一头母牛出生后三年内是不能够生出新母牛的,因此,这一批新出生的母牛就是三年前那批母牛生产出来的,即使是三年前才出生的母牛,在第n年也产出了第一只小母牛,那么三年前之前的母牛更不用说了,也就是说三年前那批母牛都可以在第n年没只生产一只小母牛。而两年前的母牛因为到了第n年也

m0_63872041的博客 1898

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[算法]牛的繁殖问题(python)

牛的繁殖问题 题目地址 问题描述 Description Cows in the FooLand city are interesting animals. One of their specialties is related to producing offsprings. A cow in FooLand produces its first calve (female calf) at t...

年糕的博客 1300

【Java】母牛繁殖问题

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛? ` public class Main{ public static void main(String args[]){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(...

weixin_43927892的博客 1714

怪物牛繁殖问题与常系数线性齐次递推关系式的通解

假设初始有一对牛,每个月生出一对小牛,新生的小牛过三个月成长为大牛,并开始繁殖,在假设所有牛不死亡的情况下,问第 nnn 个月有多少对牛? 【假设第 nnn 个月有 a[n]a[n]a[n] 对牛,那么 a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=7⋯a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=7⋯a[1] = 2, a[2] = 3, a[3] ...

New life 978

兔子、母牛繁殖问题(递归、非递归)

今天在 http://topic.youkuaiyun.com/u/20120828/12/8336bd43-4a3c-4b77-bf17-2fa854c3702e.html 看到个问题:      一头母牛从出生后,每两年可以生下一头母牛,即在第二年和第四年分别可产下一头母牛,出生后第五年将会死去。假设农场现有一头母牛,N年后农场的母牛数目是多少,编写程序实现。         我首先想到的是兔子数列(

Stay hungry, stay foolish ! 4811
上一篇: 牛客网算法基础班笔记-Chapter2
下一篇: NJU-高级算法-最长公共子序列
SSSStan2090
博客等级 码龄9年 1粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值