使用陣列儲存費波納契數列中間結果,是動態規劃「自底向上」思想的典型體現。此法不僅避免遞歸重複計算,更能隨時存取任意項數值,適用於需多次查詢或輸出完整數列的場景。
#include <stdio.h>
#define MAX_SIZE 100
int main() {
int i, n;
int fib[MAX_SIZE] = {0, 1, 1}; // 索引 0 不用,1、2 初始化為 1
printf("請輸入項數 n (1-%d): ", MAX_SIZE-1);
scanf("%d", &n);
if (n < 1 || n >= MAX_SIZE) {
printf("輸入超出範圍\n");
return 1;
}
for (i = 3; i <= n; i++) {
fib[i] = fib[i-1] + fib[i-2];
}
printf("第 %d 項: %d\n", n, fib[n]);
printf("前 %d 項完整數列: ", n);
for (i = 1; i <= n; i++) {
printf("%d ", fib[i]);
}
printf("\n");
return 0;
}
採用 fib[1]=1, fib[2]=1 對應數學定義,fib[0] 棄用,使索引與項數直觀對應,減少心智負擔。
fib[3] 可壓縮至 O(1) 空間此解法完美展示動態規劃三要素:
fib[i] = fib[i-1] + fib[i-2]預先計算前 N 項存入陣列,後續查詢 O(1) 回應,適合線上判題系統多測資案例。
陣列儲存冪次矩陣,配合二進制分解加速大 n 計算。
// 使用字串陣列模擬大數加法
char fib[1000][1000]; // 每項最多 1000 位數字
// 實作字串加法函數 big_add(char* a, char* b, char* result)
| 解法 | 時間(ms) | 記憶體(KB) | 呼叫次數 |
|---|---|---|---|
| 朴素遞歸 | ~1200 | 堆疊 ~40 | 331,160,281 |
| 記憶化遞歸 | <0.01 | 陣列 40 + 堆疊 | 79 |
| 迭代(三變數) | <0.01 | 3 變數 | 38 迴圈 |
| 陣列儲存 | <0.01 | 陣列 40 | 38 迴圈 |
int fib[3]陣列版費波納契雖非極致空間優化,但其清晰的狀態轉移邏輯與隨機存取能力,使其成為動態規劃入門的最佳範例,也是許多複雜 DP 問題的基礎範本。