杭电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 }

 

posted @ 2016-11-09 09:04  Posase  阅读(756)  评论(0编辑  收藏  举报