母牛的故事
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 85989 Accepted Submission(s): 42828
n=0表示输入数据的结束,不做处理。
每个输出占一行。
2 4 5 0
2 4 6
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;
}
提交代码