1. 程式人生 > >杭電ACM2018--母牛的故事

杭電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; }