首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

面試考題

Dynamic Programming

By Kurau·Updated 2026-05-09·2 分鐘閱讀

Dynamic Programming動態規劃是一種解決問題的方法,專門用於解決求最值的問題。通過計算部分子問題的答案,並將這些答案存儲在數組或哈希表中,我們可以避免重复計算以提高效率。

舉個例子,假設我們想要求斐波那契數列的第n項,這是一個很好的應用動態規劃的問題。我們可以用以下代碼來實現:

function fibonacci(n) {
  let dp = [0, 1];
  for (let i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}
JavaScript

這段程式碼透過儲存前兩項的答案來避免重複計算,以加快求解費波那契數列的速度。

DP 解題步驟

  1. 定義狀態:dp[i] 代表什麼?
  2. 狀態轉移方程:dp[i] 和 dp[i-1]、dp[i-2]... 的關係
  3. Base Case:起始條件是什麼?
  4. 遍歷順序:由小到大(Bottom-Up)或由大到小(Top-Down + Memoization)

經典題型

爬樓梯(Climbing Stairs)

function climbStairs(n) {
  if (n <= 2) return n;
  let dp = [0, 1, 2];
  for (let i = 3; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2];
  }
  return dp[n];
}
JavaScript

0/1 背包問題

function knapsack(weights, values, capacity) {
  const n = weights.length;
  const dp = Array(capacity + 1).fill(0);
  for (let i = 0; i < n; i++) {
    for (let w = capacity; w >= weights[i]; w--) {
      dp[w] = Math.max(dp[w], dp[w - weights[i]] + values[i]);
    }
  }
  return dp[capacity];
}
JavaScript

Top-Down vs Bottom-Up

方法優點缺點
Top-Down(記憶化遞迴)直覺、只算需要的子問題遞迴深度限制、呼叫堆疊開銷
Bottom-Up(迭代)無遞迴開銷、可空間優化需要確定遍歷順序

目錄

    ◆ 相關文章

    • Async function-Await 函式

      2026-06-02
    • throw Error用法

      2026-06-02
    • TypeScript 特性 - Interface

      2026-06-02
    • TypeScript 資料型別 - 元組(Tuple) & 列舉(Enum)

      2026-06-02
    ← 上一篇diff演算法 與 React的key值下一篇 →index key 請使用 uuid

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章