杭电2018----母牛的故事
杭电ACM2018----母牛的故事
题目
问题描述
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
输出格式
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6
分析
这道题牛个数随年份的增长发生增长,算是动态规划的入门,可以对其进行基础的理解。
其中状态有2个即年份、个数。只要找到他们的关系,推出状态转移方程即可求解
代码
1 #include<stdio.h> //朴素写法 2 int main(){ 3 int i,n,a0,a1,a2,a3; 4 //其中a0代表大于3岁牛的个数,a1代表1岁牛的个数,a2代表2岁牛个数,a3代表3岁牛个数 5 while(~scanf("%d",&n)&&n){ 6 for(i=a0=1,a1=a2=a3=0; i<n; ++i){ 7 a0=a0+a3; //今年大于3岁的牛个数 = 去年大于3岁的牛个数 + 去年3岁的牛个数 8 a3=a2; //今年3岁的牛个数 = 去年2岁的牛个数 9 a2=a1; //今年2岁的牛个数 = 去年1岁的牛个数 10 a1=a0; //今年1岁的牛个数 = 今年大于3岁的牛个数(即可生育的牛个数) 11 } 12 printf("%d\n",a0+a1+a2+a3); 13 } 14 return 0; 15 }
1 #include<stdio.h> //动态规划的简单应用 2 int dp[5][55]; // i代表岁数, j代表年份 3 //dp[0][j] -> 第j年的牛总数(此处0没有特别含义,仅仅为我自己设定的含义) 4 //dp[i][j](0 < i < 4) -> 第j年i岁牛的个数 5 //dp[4][j] -> 因为i > 3的牛都具有生育能力, 所以无需在单独列出, 即i == 4代表岁数大于3的牛个数 6 int main(){ 7 int n, i; 8 dp[0][1] = dp[4][1] = 1; dp[1][1] = dp[2][1] = dp[3][1] = 0; 9 while(~scanf("%d",&n) && n){ 10 for(int i = 2; i <= n; ++i){ 11 dp[1][i] = dp[4][i-1] + dp[3][i-1]; //今年1岁的牛个数 = 去年大于3岁的牛个数 + 去年3岁的牛个数 12 dp[2][i] = dp[1][i-1]; //今年2岁的牛个数 = 去年1岁的牛个数 13 dp[3][i] = dp[2][i-1]; //今年3岁的牛个数 = 去年2岁的牛个数 14 dp[4][i] = dp[1][i]; //今年>3岁的牛个数 = 去年>3岁的牛个数 + 去年3岁的牛个数 = 今年1岁的牛个数 15 dp[0][i] = dp[0][i-1] + dp[1][i]; //今年牛总数 = 去年牛总数 + 今年新出生(1岁)的牛个数 16 } 17 printf("%d\n",dp[0][n]); 18 } 19 return 0; 20 }