動態規劃(英語:dynamic programming,簡稱 dp)是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。
動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。
動態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。動態規劃往往用於優化遞迴問題,例如斐波那契數列,如果運用遞迴的方式來求解會重複計算很多相同的子問題,利用動態規劃的思想可以減少計算量。
通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,具有天然剪枝的功能,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化儲存,以便下次需要同乙個子問題解之時直接查表。這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用。
原問題可以拆分成若干不同部分的子問題,子問題也可以進一步的拆分為子問題(即重疊子問題),而且每乙個分枝的子問題結構應該相同(即最優子結構),通過求解這些子問題可以達到求解原問題的目的。
動態規劃希望的問題解決模式為:
dp[i]=fn(dp[i-1],num[i]),
即 :給定原資料列表num,動態規劃列表 dp中 ,dp[i] 的值應由dp[i-1]和num[i]通過某種固定的函式關係得到
問題: 連續子陣列的最大和
分解: 求解每個子陣列的最大和,比較,取最大值
由於要求連續子陣列,所以只需記錄以元素 nums[i] 為結尾的連續子陣列最大和的值,然後再比較即可。
子問題:求以元素 nums[i] 為結尾的連續子陣列最大和的值
原問題與子問題及num[i]之間的關係**移方程):
dp[i] = nums[i] + max(dp[i - 1], 0);
class
solution
return res;
}}
請完成你今天的優秀,明天再談你的優秀
理解動態規劃
看了演算法導論上對動態規劃的講解,覺得自己對動態規劃的理解又進了一步,之前在讀到 演算法之道 相關章節時就有這感覺,但是仍然不敢說自己已經完全掌握了動態規劃,只是比以前又透徹了一些,說說自己新的理解,其實就是複述一下演算法導論上的內容而已。裝配線排程問題 乙個產品要經過n道工序,有兩條裝配鏈提供著n...
理解動態規劃
通過了解契波那契數列學習動態規劃 問題 斐波那契數列為1 1 2 3 5 8 13 21 34 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的第n項。遞迴方法 includeusing namespace std int dfs int x int main return a x int...
動態規劃基礎
to find the fastest way through a factory.這個問題我簡述下 乙個產品的出場要經過多道工序的加工方可出場。某工廠有兩條工作線,每條工作線都具有n道工序。並且對應位置的工序執行相同的操作,但是他們具有不同的時間代價。在同一條工作線當中,由當前工序轉移到下一道工序...