杭電ACM2018--母牛的故事
阿新 • • 發佈:2019-01-12
母牛的故事
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 120200 Accepted Submission(s): 58541
Input 輸入資料由多個測試例項組成,每個測試例項佔一行,包括一個整數n(0<n<55),n的含義如題目中描述。
n=0表示輸入資料的結束,不做處理。
每個輸出佔一行。
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;
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; }