HDUOJ 2018

来源:互联网 发布:免费刷会员永久软件 编辑:程序博客网 时间:2024/06/02 16:21

母牛的故事

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
2450
 

Sample Output
246
 
除了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;}



原创粉丝点击