實踐題目
2-3 蜜蜂路線 (20分)
問題描述
有一隻經過訓練的蜜蜂只能爬向右側相鄰的蜂房,不能反向爬行。請程式設計計算蜜蜂從蜂房a爬到蜂房b的可能路線數。 其中,蜂房的結構如下所示。
輸入格式:
輸入 m,n 的值, 0<m<n<30
輸出格式:
一個整數,爬行有多少種路線
輸入樣例:
1 14
輸出樣例:
377
演算法描述
看圖形,每到一個數,就有兩條路可走,滿足斐波那契數列的模型,因此這道題實際上還是用遞迴演算法求解。不過這裡應該注意的是,此時是逆向求解,要求f(1),得先一直遞迴直到能求f(12),再反過來求f(1)
#include <iostream> #define SIZE 15001 using namespace std; int f[SIZE] ; int main(){ int n, m, i; cin >> m >> n; f[m]=1; f[m+1]=1; for (i = m+2; i <= n; i++) f[i] = f[i-1] + f[i-2]; cout << f[n] << endl; return 0; }
演算法時間及空間複雜度分析(要有分析過程)
時間複雜度:
複雜度實際上在與迴圈次數有關T(n) = 3 + 3 * (n - m + 1) =O(n)
空間複雜度:
因為每個變數空間複雜度為O(1),斐波那契數列的非遞迴演算法空間複雜度為O(1)。
心得體會(對本次實踐收穫及疑惑進行總結)
其實這道題一開始我是完全讀不懂題意,甚至那些樣例我也看不懂,因為14,377都太大了,很難列舉找出關係,甚至後來上網查詢有關這道題,我也還是搞不懂為什麼這道題屬於斐波那契數列,後來在部落格上多看了其他人的做法學習,後來就慢慢理解了。這道題算是演算法的入門級題吧,讓我意識到一道奇奇怪怪的題,裡面的做法都是來自演算法的方法裡,可能很難理解,但就是能用演算法裡的方法將這種奇怪的題化成書裡那些經典的例題,像最近才做完的派這道題也是這樣。