動態規劃背景

2021-10-13 20:17:18 字數 1186 閱讀 7801

動態規劃(英語:dynamic programming,簡稱 dp)是一種在數學、管理科學、電腦科學、經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。

動態規劃不是某一種具體的演算法,而是一種演算法思想:若要解乙個給定問題,我們需要解其不同部分(即子問題),再根據子問題的解以得出原問題的解。

應用這種演算法思想解決問題的可行性,對子問題與原問題的關係,以及子問題之間的關係這兩方面有一些要求,它們分別對應了最優子結構和重複子問題。

最優子結構

最優子結構規定的是子問題與原問題的關係

動態規劃要解決的都是一些問題的最優解,即從很多解決問題的方案中找到最優的乙個。當我們在求乙個問題最優解的時候,如果可以把這個問題分解成多個子問題,然後遞迴地找到每個子問題的最優解,最後通過一定的數學方法對各個子問題的最優解進行組合得出最終的結果。總結來說就是乙個問題的最優解是由它的各個子問題的最優解決定的。

將子問題的解進行組合可以得到原問題的解是動態規劃可行性的關鍵。在解題中一般用狀態轉移方程描述這種組合。例如原問題的解為 f(n)f(n),其中 f(n)f(n) 也叫狀態。狀態轉移方程 f(n) = f(n - 1) + f(n - 2)f(n)=f(n−1)+f(n−2) 描述了一種原問題與子問題的組合關係 。在原問題上有一些選擇,不同選擇可能對應不同的子問題或者不同的組合方式。例如

n=2k 和 n = 2k + 1n=2k+1 對應了原問題 nn 上不同的選擇,分別對應了不同的子問題和組合方式。

找到了最優子結構,也就能推導出乙個狀態轉移方程 f(n)f(n),通過這個狀態轉移方程,我們能很快的寫出問題的遞迴實現方法。

解決動態規劃問題的核心:找出子問題及其子問題與原問題的關係

找到了子問題以及子問題與原問題的關係,就可以遞迴地求解子問題了。但重疊的子問題使得直接遞迴會有很多重複計算,於是就想到記憶化遞迴法:若能事先確定子問題的範圍就可以建表儲存子問題的答案。

動態規劃演算法中關於最優子結構和重複子問題的理解的關鍵點:

證明問題的方案中包含一種選擇,選擇之後留下乙個或多個子問題

設計子問題的遞迴描述方式

證明對原問題的最優解包括了對所有子問題的最優解

證明子問題是重疊的(這一步不是動態規劃正確性必需的,但是如果子問題無重疊,則效率與一般遞迴是相同的)

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...

Hexo Next動態背景Canvas nest

1 在next6.0以上版本,直接在主題檔案下的 themes next config.yml設定canvas nest屬性為true,動態背景是沒法生效。在 config.yml中也可以看到canvas nest裡面有注釋資訊 canvas nest dependencies for more i...