86 母牛的数量

86 母牛的数量

作者: xxx时间限制: 1S章节: 一维数组

问题描述 :

有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?说明:假设在第n年及之前所有牛都不曾死亡。

 

输入说明 :

首先输入一个T,表示以下包含T行输入数据(测试实例),每行包括一个整数n(0<n<55),n的含义如题目中描述。

 

输出说明 :

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

每个输出占一行,行首与行尾均无空格,最后无空行。

 

输入范例 :

3
1
30
53

 

输出范例 ::

1
85626
563332848

 

解题思路:这道题目其实有很强的规律性。先推算出前几项容易的,可以画出以下表格

 

 

然后我们可以发现一个规律,即now[i] = now[i-1] + now[i-3];i>=4。

 

根据这个规律我们可以写出两种风格的代码(提倡第二种写法)

 

一种是递归性质的如下:(这种有点滥用动态规划了,其实可以提前填好数组答案,推荐方法二)

方法一:

 

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <ctype.h>
 6 
 7 
 8 
 9 
10 __int64 resultNum(__int64 n);
11 
12 __int64 record[60];
13 
14 int main(){
15 
16 
17 
18     int t,i,j,n;
19     scanf("%d",&t);
20     for(i=0;i<60;i++){
21         if(i>=1&&i<=4){
22             record[i]=i;
23         }else{
24             record[i]=-1;    
25         }
26     }
27     while(t--){
28         scanf("%d",&n);
29         __int64 res = resultNum(n);
30         printf("%ld\n",res);
31     }
32     return 0;
33 }
34 
35 
36 __int64 resultNum(__int64 n){
37     if(record[n]!=-1){
38         return record[n];
39     }
40     record[n] =  resultNum(n-3)+resultNum(n-1);
41     return record[n];
42 }

 

 

 

 

 方法二:根据明显的递推关系now[i] = now[i-1] + now[i-3];i>=4。直接填好答案进入数组。代码如下:

简洁且简单,推荐方法二。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <ctype.h>
 6 
 7 
 8 
 9 __int64 now[60]={0,1,2,3};
10 
11 void answer();
12 
13 
14 int main(){
15 
16     int t,n,i;
17     
18     answer();
19 
20     scanf("%d",&t);
21     while(t--){
22         scanf("%d",&n);
23         printf("%ld\n",now[n]);
24     }
25     
26     return 0;
27 }
28 
29 void answer(){
30 
31     int i;
32     for(i=4;i<=56;i++){
33         now[i] = now[i-1] + now[i-3];    
34     }
35 
36 }

 

posted @ 2020-03-17 22:22  focusDing  阅读(201)  评论(0编辑  收藏  举报