HDU OJ 2018 母牛的故事

母牛的故事

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


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

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

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

Sample Input
  
2 4 5 0
 

Sample Output
  
2 4 6
 

Author
lcy
 

Source
 

Recommend

lcy   |   We have carefully selected several similar problems for you:  2013 2041 2017 2010 2046 



动态规划的一种题型

具体思路 :



/*
模拟找规律:(括号里面代表牛是第几年的 只有四年牛才会产小牛)


典型的动态规划题目:


我们用dp_1,dp_2,dp_3,dp_4;分别来表示一年牛,两年牛,三年牛,四年牛;
依照题目意思 只有四年牛 才可以生小牛。


第1年~   dp_4          1头
第2年~   dp_4   +  dp_1                                      2头
第3年~   dp_4   +  dp_2   + dp_1      3头
第4年~   dp_4   +  dp_3   + dp_2   + dp_1    4头
第5年~   dp_4*2 +  dp_3   + dp_2   + dp_1*2    6头
第6年~   dp_4*3 +  dp_3   + dp_2*2 + dp_1*3    9头
第7年~   dp_4*4 +  dp_3*2 + dp_2*3 + dp_1*4    13头
第8年~   dp_4*6 +  dp_3*3 + dp_2*4 + dp_1*6    19头




这里有 一年的四年牛的数量   :dp_4(n)   =  dp_4(n-1) + dp_3(n-1);            上一年的四年牛加 三年牛 
而三年牛的数量        :dp_3(n-1) =  dp_2(n-2);        上一年的两年牛数量
同理两年牛的数量    :dp_2(n-2) =  dp_1(n-3);        上一年的一年牛数量


          所以     dp_4(n) = dp_4(n-1) + dp_1(n-3) ;      A        等于上一年的四年牛+三年前的一年牛
          
          同理     :   dp_4(n-1) = dp_4(n-2) +dp_3(n-2);
           :   dp_3(n-2) = dp_2(n-3);
 
          所以            dp_4(n-1) = dp_4(n-2)+dp_2(n-3);        B


然后            dp_4(n-2) = dp_4(n-3)+dp_3(n-3);        C


        C代入B然后再代入A 得   dp_4(n)   = dp_1(n-3)+dp_2(n-3)+dp_3(n-3)+dp_4(n-3)   =  f(n-3);  


  而    dp_4(n) 就代表着 这一年 新增牛的数量 即 dp_4(n)=dp_1(n);

所以有       f(n) - f(n-1) = dp_1(n) = dp_4(n) = f(n-3)   
   f(n)=f(n-1)+f(n-3);

 */


/*
   母牛生小牛
 */
// code:
#include <iostream>
using namespace std;

int f(int n) {
	if (n==0) return 0;
	if (n>=1&&n<=4)return n;
	else return f(n-1)+f(n-3); 
}
int  main() {
	int n;
	while(cin>>n,n) 
		cout<<f(n)<<endl;
	return 0;
}

提交代码




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值