HDU2018-母牛的故事

题目:

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾影林深

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值