動態規劃 資料結構與演算法學習

2021-10-05 16:44:35 字數 1028 閱讀 6674

求最值窮舉

重疊子問題→暴力窮舉效率低下

最優子結構→通過子問題最值得到原問題最值

狀態轉移方程→正確的窮舉

明確【狀態】 -> 定義dp陣列/函式的意義 -> 明確【選擇】-> 明確base case

fibnacci數列

// 遞迴

intfib

(int n)

//備忘錄解法, 自頂向下

intfib

(int n)

inthelper

(vector<

int>

& memo,

int n)

// 動態規劃, 自底向上

intfib

(int n)

return dp[n];}

// o(1)複雜度,只儲存前兩個狀態

intfib

(int n)

return cur;

}

湊零錢問題

// 暴力遞迴(如何窮舉)

intcoinchange

(vector<

int>

& coins,

int n)

return mini;

}// 備忘錄

intcoinchange

(vector<

int>

& coins,

int n)

inthelper

(vector<

int>

& coins,

int n)

return memo[n];}

// 動態規劃(如何聰明的窮舉)

intcoinchange

(vector<

int>

& coins,

int n)

}return dp[n]

;}

資料結構與演算法學習筆記 動態規劃的入門與程式設計實現

本文的內容部分引自 我們遇到的問題中,有很大一部分可以用動態規劃 簡稱dp 來解。解決這類問題可以很大地提公升你的能力與技巧,我會試著幫助你理解如何使用dp來解題。這篇文章是基於例項展開來講的,因為乾巴巴的理論實在不好理解。動態規劃演算法通常基於乙個遞推公式及乙個或多個初始狀態。當前子問題的解將由上...

演算法與資料結構 動態規劃

動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...

演算法與資料結構 動態規劃

用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...