HDUOJ 2018

母牛的故事

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 21477    Accepted Submission(s): 10359


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

Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
 

Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
 

Sample Input
2 4 5 0
 

Sample Output
2 4 6
 
除了hanoi塔和大数阶乘,这是我遇到的第一个递归问题,虽然简单,但也在此留念。
分析:
设第n年有f(n)头牛,易分析出f(n)由f(n-1)和f(n-3)决定。第n-1年有f(n-1)头牛,假设这些牛中第n年刚好能生育的牛有s头,第n年能生育但不是刚好能生育的牛有t头,第n年不能生育的有k头,故f(n)=2*s+2*t+k=(s+t+k)+(s+t)=f(n-1)+(s+t),又设第n-3年的牛中该年新生的牛有p头,非新生的牛有q头,新生的p头牛在第n年刚好能生育,故p=s。假设一头牛是q中的一头,则它必在第n年为t中的一头,反之亦然,得q=t,故s+t=p+q=f(n-3),因此f(n)=f(n-1)+f(n-3)。并且由题意得f(i)=i(i=1,2,3)。
如果用函数递归耗时会比较多,由于n<55 , 因此用数组存储值。

#include <iostream>
using namespace std;
int main()
{
	int a[55]={0,1,2,3},i,n;
	for(i=4;i<=54;i++) a[i]=a[i-1]+a[i-3];
	while(cin>>n)
	{
		if(n==0) break;
		else cout<<a[n]<<endl;
	}
	return 0;
}



原文地址:https://www.cnblogs.com/cszlg/p/2910544.html