フィボナッチDP(ローリング変数)による O(n) / O(1) 実装
n
段の階段を登ります。 毎回 1歩 または
2歩 だけ登れるとき、 頂上への
異なる登り方の総数 を返してください。
n段目に到達するには 必ず 直前の2パターンから来る:
① (n-1)段目から1歩 ② (n-2)段目から2歩
よって
f(n) = f(n-1) + f(n-2)
→ フィボナッチ数列そのもの!
フローの説明:
1. 入力
n を受け取り、n ≤ 2
なら即
n
を返す(基底条件)。
2.
prev2=1, prev1=2
で初期化後、n-2
回ループで更新。
3. タプル代入
prev2, prev1 = prev1, prev1+prev2
で一時変数ゼロの安全なローリング更新。
4. ループ終了後に
prev1(= f(n))を返す。
| アプローチ | 時間計算量 | 空間計算量 | 備考 |
|---|---|---|---|
| 再帰(素朴) | O(2ⁿ) | O(n) | n=45 で約35兆回呼び出し → TLE確定 |
| メモ化再帰 @cache | O(n) | O(n) | コールスタック + 辞書でヒープ消費 |
| DP配列 (list) | O(n) | O(n) | 直感的だが配列サイズnが無駄 |
| ✅ ローリング変数(採用) | O(n) | O(1) ★ | 変数2個のみ・ヒープゼロ |
| 定数テーブル | O(1) | O(1) | n≦45限定。参照のみ。 |