
- 資料結構與演算法
- DSA - 首頁
- DSA - 概述
- DSA - 環境設定
- DSA - 演算法基礎
- DSA - 漸近分析
- 資料結構
- DSA - 資料結構基礎
- DSA - 資料結構和型別
- DSA - 陣列資料結構
- 連結串列
- DSA - 連結串列資料結構
- DSA - 雙向連結串列資料結構
- DSA - 迴圈連結串列資料結構
- 棧與佇列
- DSA - 棧資料結構
- DSA - 表示式解析
- DSA - 佇列資料結構
- 搜尋演算法
- DSA - 搜尋演算法
- DSA - 線性搜尋演算法
- DSA - 二分搜尋演算法
- DSA - 插值搜尋
- DSA - 跳躍搜尋演算法
- DSA - 指數搜尋
- DSA - 斐波那契搜尋
- DSA - 子列表搜尋
- DSA - 雜湊表
- 排序演算法
- DSA - 排序演算法
- DSA - 氣泡排序演算法
- DSA - 插入排序演算法
- DSA - 選擇排序演算法
- DSA - 歸併排序演算法
- DSA - 希爾排序演算法
- DSA - 堆排序
- DSA - 桶排序演算法
- DSA - 計數排序演算法
- DSA - 基數排序演算法
- DSA - 快速排序演算法
- 圖資料結構
- DSA - 圖資料結構
- DSA - 深度優先遍歷
- DSA - 廣度優先遍歷
- DSA - 生成樹
- 樹資料結構
- DSA - 樹資料結構
- DSA - 樹的遍歷
- DSA - 二叉搜尋樹
- DSA - AVL樹
- DSA - 紅黑樹
- DSA - B樹
- DSA - B+樹
- DSA - 伸展樹
- DSA - Trie樹
- DSA - 堆資料結構
- 遞迴
- DSA - 遞迴演算法
- DSA - 使用遞迴實現漢諾塔
- DSA - 使用遞迴實現斐波那契數列
- 分治法
- DSA - 分治法
- DSA - 最大最小問題
- DSA - Strassen矩陣乘法
- DSA - Karatsuba演算法
- 貪心演算法
- DSA - 貪心演算法
- DSA - 旅行商問題(貪心演算法)
- DSA - Prim最小生成樹
- DSA - Kruskal最小生成樹
- DSA - Dijkstra最短路徑演算法
- DSA - 地圖著色演算法
- DSA - 分數揹包問題
- DSA - 帶截止時間的作業排序
- DSA - 最優合併模式演算法
- 動態規劃
- DSA - 動態規劃
- DSA - 矩陣鏈乘法
- DSA - Floyd-Warshall演算法
- DSA - 0-1揹包問題
- DSA - 最長公共子序列演算法
- DSA - 旅行商問題(動態規劃)
- 近似演算法
- DSA - 近似演算法
- DSA - 頂點覆蓋演算法
- DSA - 集合覆蓋問題
- DSA - 旅行商問題(近似演算法)
- 隨機化演算法
- DSA - 隨機化演算法
- DSA - 隨機化快速排序演算法
- DSA - Karger最小割演算法
- DSA - Fisher-Yates洗牌演算法
- DSA有用資源
- DSA - 問答
- DSA - 快速指南
- DSA - 有用資源
- DSA - 討論
動態規劃
動態規劃方法類似於分治法,將問題分解成越來越小的子問題。但與分治法不同的是,這些子問題不是獨立解決的。相反,這些較小子問題的結果會被記住並用於類似的或重疊的子問題。
大多數情況下,動態規劃演算法用於解決最佳化問題。在解決手頭的子問題之前,動態演算法會嘗試檢查先前解決的子問題的結果。子問題的解被組合起來以獲得最佳最終解。因此,這種範例被稱為自底向上方法。
所以我們可以得出結論:
問題應該能夠被分解成更小的重疊子問題。
可以使用較小子問題的最優解來獲得最終的最優解。
動態演算法使用記憶化。

然而,在一個問題中,兩個主要屬性可以表明給定的問題可以使用動態規劃來解決。它們是:
重疊子問題
與分治法類似,動態規劃也組合子問題的解。它主要用於一個子問題的解需要重複使用的地方。計算出的解儲存在一個表中,因此不必重新計算。因此,當存在重疊子問題時,需要這種技術。
例如,二分查詢沒有重疊子問題。而斐波那契數的遞迴程式有很多重疊子問題。
最優子結構
如果給定問題的最優解可以使用其子問題的最優解獲得,則給定問題具有最優子結構屬性。
例如,最短路徑問題具有以下最優子結構屬性:
如果節點x位於從源節點u到目標節點v的最短路徑中,則從u到v的最短路徑是從u到x的最短路徑和從x到v的最短路徑的組合。
像Floyd-Warshall和Bellman-Ford這樣的標準全對最短路徑演算法是動態規劃的典型例子。
動態規劃方法的步驟
動態規劃演算法的設計遵循以下四個步驟:
描述最優解的結構。
遞迴地定義最優解的值。
計算最優解的值,通常以自底向上的方式。
根據計算出的資訊構造最優解。
動態規劃與貪心演算法與分治法的比較
與解決區域性最佳化的貪心演算法相比,動態演算法的目標是對問題進行全域性最佳化。
與分治演算法(其中解被組合以獲得全域性解)相比,動態演算法使用較小子問題的輸出,然後嘗試最佳化較大的子問題。動態演算法使用記憶化來記住已解決子問題的輸出。
動態規劃的例子
以下計算機問題可以使用動態規劃方法解決:
動態規劃可以自頂向下和自底向上兩種方式使用。當然,大多數情況下,參考之前的解輸出比重新計算在CPU週期方面更便宜。