杭电ACM2018--母牛的故事

母牛的故事

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


Problem Description
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
 
Input
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
n=0表示输入数据的结束,不做处理。
 
Output
对于每个测试实例,输出在第n年的时候母牛的数量。
每个输出占一行。
 
Sample Input
2 4 5 0
 
Sample Output
2 4 6

 
这道题涉及的内容是递归化成递推,这类型的题以后会演化成动态规划,重在练习和思考!!
首先拿到题目想到的就是动物繁殖典型例子斐波那契数列,fn=f(n-1)+f(n-2)
同样的,本题可以枚举他前十个数来观察,很多题目都可以这么做,ACM一部分感觉就是在玩小学找规律T T
回到正题··然后得到fn=f(n-1)+f(n-3)
有了这个就可以直接递归了AC了~~
再深入一些学习这道题,把繁琐的递归转成迭代,我个人是用两个概念来引导自己思考
1.有所有状态的状态方程
2.找出各个状态的转换式
状态方程即是  fn=f(n-1)+f(n-3)
转换式可以这么尝试,举个例子吧~
如:
假如每年的牛数量都是已知的
第四年的牛等于第三年的牛加第一年的牛
第五年的牛等于第四年的牛加第二年的牛 
fn=f1+f3;   这里完成了fn的状态转化
 
第一年的牛过了一年成了第二年的牛
f1=f2;  这里完成了f1的状态转化

第三年的牛过了一年成了第四年的牛
f2=f3;  这里是记录第二年过了一年成第三年没用上的
f3=fn;  这里完成了f2的状态转化
然后就可以有以下代码


#include<stdio.h>
//递归 
 int sum(int n)
{
    if (n <= 4) return n;
    else return (sum(n-1) + sum(n - 3));
}
int main()
{
    int n;
    while (~scanf("%d", &n) != EOF&&n!=0)
        printf("%d\n", sum(n));
    getchar();
    return 0;
}
#include<stdio.h>
//迭代 
int main()
{
    int f1,f2,f3,fn,i,n;
    while(~scanf("%d",&n)&&n!=0)
    {
        if(n==1)fn=1;
        else if(n==2)fn=2;
        else if(n==3)fn=3;
        else
        {
            f1=1;
            f2=2;
            f3=3;
            for(i=4;i<=n;i++)
            {
                fn=f1+f3;
                f1=f2;       
                f2=f3;
                f3=fn;    
            }
        }    
        printf("%d\n",fn);
    }
    return 0;
 } 

猜你喜欢

转载自www.cnblogs.com/lightice/p/10261270.html