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表示输入数据的结束,不做处理。
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; }