题目:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入n,n<=55;
代码:
不知道为什么第一年只有1头,不应该有两头吗。。不懂
Code1
递归 + 模拟,(无脑版)
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
const int N = 65;
int dp[N][N] = {0};
int cow(int i, int age); // 来到第i年, 此时age岁 产下的所有幼崽 包括自己
signed main(){
//freopen("in.txt", "r", stdin);
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
dp[i][j] = -1;
}
}
cin>>n;
cout<<cow(1, 3)<<endl; //第一头母牛 第一年不能生
return 0;
}
int cow(int i, int age){
if(i == n+1){
return 1; //视为1个有效方案 1个cow()对应1头母牛
}
if(dp[i][age] != -1){
return dp[i][age];
}
int res = cow(i+1, age+1);
if(age >= 4){
res += cow(i, 1); //当年就可以生,当年1岁
}
dp[i][age] = res;
return res;
}
Code2
若dp[i]表示第 i 年的母牛数, 则可得到递推表达式
dp[i] = dp[i-1] + dp[i-3] //上一年母牛 + 新生母牛(>=4岁母牛生出)
主要代码如下:
int dp[56] = {0,1,2,3,4};
int n;
cin>>n;
for(int i=5;i<=n;i++){
dp[i] = dp[i-1] + dp[i-3];
}
cout<<dp[n]<<endl;