输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
2<br/>4<br/>5
2<br/>4<br/>6
F(1) = 1,F(2) = 2,F(3)= 3, F(4)= 4,
从第4年后(即第五年),大母牛生的小母牛开始可以生小牛,F(5)=F(4)+F(2),即F(n)= F(n-1)+F(n-3),意思为去年的牛数量+可以生小牛的牛的数量=现在的数量
由于又多组数据,可以直接打表,打表的时间复杂度为O(n)(n为表长),加Q次查询,时间复杂度为O(n+Q).
/*
* 详解:https://blog.csdn.net/qq_33375598/article/details/104607549
*/
#include <cstdio>
const int MAXN = 60;
int ans[MAXN]= {0,1,2,3};
int main(int argc, char const *argv[]){
int n;
for (int i = 4; i < 55; ++i) {//打表
ans[i] = ans[i-1] + ans[i -3];//去年的牛+出生后的牛生的小牛
}
while(scanf("%d", &n) != EOF){
printf("%d\n", ans[n]);
}
return 0;
}
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int[] numbers=new int[85];
numbers[1]=1;
numbers[2]=2;
numbers[3]=3;
numbers[4]=4;
while(sc.hasNext()){
int n=sc.nextInt();
for(int i=5;i<85;i++){
numbers[i]=numbers[i-1]+numbers[i-3];
}
System.out.println(numbers[n]);
}
}
}
public class Solution {
// dp 定义: dp[i] 表示第i年有多少头牛
// 初始化: dp[1] = dp[2] = dp[3] = dp[4] = 1;
// 递推式: dp[i] = dp[i-1] + dp[i-3] (当前的牛数量 = 去年的牛数量 + 可以生小牛的牛数量)
// 前三年的牛有 dp[i-3],这些牛包括了成熟的母牛(每年生一头),也包括了未成熟的小牛(它们在第四年可以生一头牛)
// 所以把这两部分累加起来,也就是这dp[i-3]头牛可以在第i年生 dp[i-3]头
// 可以结合这个例子理解一下: F(5) = F(4) + F(2);画个图好理解一点
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] dp = new int[60];
dp[1] = dp[2] = dp[3] = dp[4] = 1;
for (int i = 5; i < dp.length; i++) {
dp[i] = dp[i - 1] + dp[i - 3];
}
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
System.out.println(dp[a]);
}
}
} 递推式的推导,画图比较清晰(设i = 5)
#include <stdio.h>
int main()
{
int a[56],b[56],ans[56]; //a表示新生的,b表示能生的
a[1]=0;b[1]=1;ans[1]=1;
for(int i=2;i<56;i++)
{
b[i]=b[i-1];
if(i>3)
b[i]+=a[i-3];
a[i]=b[i];
ans[i]=ans[i-1]+a[i];
}
int n;
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",ans[n]);
}
return 0;
} 解题思路:
话不多说,典型的递推规律题,我们先计算几个结果:
注:(老母牛代表n ≥ 4)
老母牛 初生 2年 3年 总数
第1天 1 0 0 0 1
第2天 1 1 0 0 2
第3天 1 1 1 0 3
第4天 1 1 1 1 4
第5天 2 2 1 1 6
第6天 3 3 2 1 9
————————————————
版权声明:本文为CSDN博主「hestyle」的原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://hestyle.blog.csdn.net/article/details/104626984
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
//建立一张表,用于f(n)各项值,需要使用long long类型,否则会产生溢出
long long fTable[56] = {0, 1, 2, 3};
//注意数组下标从0开始,而计算从1开始
for (int i = 4; i < 56; ++i) {
fTable[i] = fTable[i - 1] + fTable[i - 3];
}
int number = 0;
//scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
while (scanf("%d", &number) != - 1) {
printf("%lld\n", fTable[number]);
}
return 0;
}
//这么多类似斐波那契数列的题?
#include <stdio.h>
#include <stdlib.h>
int main()
{
//c0记录可以产子的牛,c1,c2,c3记录养了1,2天的牛
long long int c0[55] = {1, 1, 1, 2, 3}, c1[55] = {0, 1, 1, 1, 2}, c2[55] = {0, 0, 1, 1, 1};
long long int sum[55] = {1, 2, 3, 4, 6};
int n;
int start = 5;
while(~scanf("%d", &n))
{
if(n > start)
{
for(int i = start; i < n; i++)
{
c0[i] = c2[i-1] + c0[i-1];
c2[i] = c1[i-1];
c1[i] = c0[i-1];
sum[i] = c0[i] + c1[i] + c2[i];
}
start = n;
}
printf("%ld\n", sum[n-1]);
}
} #include<iostream>
(720)#include<vector>
using namespace std;
/*
题目问到n年一共有多少头牛,一般而言,要算牛总数,需要算每年生产的牛数,最后累加即可
每年生产的牛数即为当年的成牛数
dp[i]=dp[i-1]+dp[i-3];
*/
int main() {
int n;
vector<int> dp(3, 1); //前3年都只有一个成年母牛可以生育,每年都生一个
for (int i = 3; i < 56; i++) {
dp.push_back(dp[i - 1] + dp[i - 3]);
}
vector<int> sum;
sum.push_back(1); //最初的母牛
for (int i = 1; i < 56; i++) {
sum.push_back(sum[i - 1] + dp[i - 1]);
}
while (cin >> n) {
cout << sum[n - 1] << endl;
}
} import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int N = 56;
long[] f = new long[N];
f[1] = 1;
f[2] = 2;
f[3] = 3;
f[4] = 4;
for (int i = 5; i < N; i++) {
f[i] = f[i - 1] + f[i - 3];
}
while (input.hasNext()) {
int n = input.nextInt();
System.out.println(f[n]);
}
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int[] a=new int[56];
a[1]=1;
a[2]=2;
a[3]=3;
for(int i=4;i<a.length;i++)
a[i]=a[i-1]+a[i-3];
while(sc.hasNext()){
int c=sc.nextInt();
System.out.println(a[c]);
}
}
}
var func = function (n) {
let res = [0, 1, 2, 3]
if (res.indexOf(n) !== -1)
return res[n]
for (let i = 4; i <= n; i++) {
res.push(res[i - 1] + res[i - 3])
}
return res[n]
}
var func = function (n) {
let res = [null, 1, 2, 3, null]
if (res.indexOf(n) !== -1)
return res[n]
for (let i = 4; i <= n; i++) {
res[4] = res[1] + res[3]
;[res[1], res[2], res[3]] = [res[2], res[3], res[4]]
}
return res[4]
}
import java.util.Scanner;
/**
* 有一头母牛,它每年年初生一头小母牛。
* 每头小母牛从第四个年头开始,
* 每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
*/
public class Muniu {
public static int f1(int n) {
if (n == 0){
return 0;
}
int[] a = new int[n+1];
if (n == 1){
return 1;
}else if (n == 2){
return 2;
}else if (n == 3){
return 3;
}else {
a[1] = 1;
a[2] = 2;
a[3] = 3;
for (int i = 4;i <= n; i++) {
a[i] = a[i-1] + a[i-3];
}
return a[n];
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextInt()) {
int n = sc.nextInt();
System.out.println(f1(n));
}
sc.close();
}
/**复杂度过高
public static int f(int n) {
if(n == 1){
return 1;
}else if(n == 2){
return 2;
}else if (n == 3){
return 3;
}else {
return f(n-1) + f(n-3);
}
}
**/
}
其实题目是有错误的,按照他的说法V[0] 应该是 两头?
不过递推公式的思路是没有错的。
#include <iostream>
#include <vector>
using namespace std;
/*
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
*/
int main()
{
vector<long long> v(56);
long long temp;
v[0] = 1;// D
v[1] = 2;// D A
v[2] = 3;// D A B
v[3] = 4;// D A B C
v[4] = 6;// D A B C D D A
for (int i = 4; i < 56; i++)
{
v[i] = v[i - 1] + v[i - 3];
}
int n;
while (cin >> n)
{
cout << v[n-1] << endl;
}
}
import java.util.Scanner;public class Main{public static void main(String args[]){Scanner sc = new Scanner(System.in);while(sc.hasNext()){intn = sc.nextInt();inta[] = new int[n+3];a[1] = 1;a[2] = 2;a[3] = 3;for(int i = 4; i <= n; i++){a[i] = a[i-1] + a[i-3];}System.out.println(a[n]);}sc.close();}}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int n = scanner.nextInt(); int a[] = new int[100];
a[1] = 1;
a[2] = 2;
a[3] = 3;
a[4] = 4; if (n 4) {
System.out.println(n);
} else { for (int i = 5; i <= n; i++) {
a[i] = a[i - 1] + a[i - 3];
}
System.out.println(a[n]);
}
}
}