動態規劃(dynamic programming)與分治法相似,都是通過組合子問題的解來求解原問題,動態規劃應用於子問題重疊的情況,即不同的子問題具有公共的子子問題。通常按照下面4個步驟來設計乙個動態規劃演算法:
1. 刻畫乙個最優解的結構特徵。
2. 遞迴地定義最優解的值
3. 計算最優解的值,通常採用自底向上的方法
4. 利用計算出的資訊構造乙個最優解
這是演算法導論上的定義,但是這個定義對於初學者來說並沒有很大的幫助,因為不知道如何劃分子問題和刻畫最優解的結構
動態規劃的本質是對問題的狀態的定義和轉態轉移方程的定義
動態規劃是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。但如何拆分問題才是動態規劃的核心,而拆分問題靠的是狀態的定義和狀態方程的定義。
1.1 狀態的定義
現舉乙個列子:
給定乙個數列,長度為n,
求這個數列的最長上公升(遞增)子數列(lis)的長度.以 1
7283
4為例。
這個數列的最長遞增子數列是 123
4,長度為4;
次長的長度為3, 包括 1
78; 1
23 等.
要解決這個問題首先我們需要定義這個問題和這個問題的子問題。
所以我麼重新定義這個問題
給定乙個長度為n的數列。 設f
k 為:以數列中第k項結尾的最長遞增子串行的長度. 求f
1...
fn的最大值
很顯然這個問題與原問題是等價的。
而對於f
k 來說,f1
.. fk
−1都是fk
的子問題:因為以第k項結尾的最長遞增子串行(簡稱lis),包含著以第1 … k 項結尾的lis。
上述問題中fk
稱之為狀態,定義中的」fk
為數列中第k項結尾的lis的長度」就叫做狀態的定義。之所以把fk
叫做」狀態」而不是」問題」,一是因為避免與原問題中」問題」混淆,二是因為這個新問題是數學化定義的。
當然,我們可以使用不同的視角來定義這個問題:
給定乙個長度為n的數列, 設f
i,k 為:
在前i項中,長度為k的最長遞增子串行中,最後一位的最小值。 1≤
k≤n
若在前i項中,不存在長度為k的最長遞增子串行,則fi
,k為正無窮。
求最大的x,使得fn
,x不為正無窮。
這個問題的定義與原問題也是等價的。
上述的fi,
k 就是狀態,定義中的「fi
,k為:在前項中,長度為k 的最長遞增子串行中,最後一位的最小值」就是對狀態的定義。
1.2 什麼是狀態轉移方程?
上述狀態定義好之後,轉態和轉態之間的關係式,就叫做狀態轉移方程
對於lis問題,第一種定義: 設f
k 為:以數列中第k項結尾的最長遞增子串行的長度。
設a為題中數列,轉態轉移方程為: f1
=1(根據定義匯出邊界情況) fk
=max
(fi+
1|ak
>ai
,i∈(
1...
k−1)
(k>1)
文字解釋為:
以第k項結尾的lis的長度是:保證第i項小的情況下,以第i項結尾的lis長度加1的最大值,取遍i的所有值(i小於k).
第二種定義: 設f
i,k 為:在數列前i項中,長度為k的遞增子串行中,最後一位的最小值
設a為題中數列,狀態轉移方程為: 若a
i>fi
−1,k
−1則fi,
k=mi
n(ai
,fi−
1,k)
否則:fi
,k=f
i−1,
k (邊界情況需要分類討論較多,在此不列出,需要根據狀態定義匯出邊界情況。)大家套著定義讀一下公式就可以了,應該不難理解,就是有點繞。
這裡可以看出,這裡的狀態轉移方程,就是定義了問題和子問題之間的關係。
可以看出,狀態轉移方程就是帶有條件的遞推式。
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...
什麼是動態規劃?
一 基本思想 態規劃演算法的基本思想與分治法類似,都是將問題大問題拆分為小問題,通過小問題的求解來得到最後的解。與分治法不同的是,分治法是分而治之,分治法將大問題拆分為相同性質的子問題,最後合併子問題的解來構成最終解。而動態規劃是,將子問題拆解後,按順序求解子問題,前面階段的求解為後一階段提供有用資...
什麼是動態模型
動態模型著重於系統的控制邏輯,考察在任何時候物件及其關係的改變,描述這些涉及時序和改變的狀態。動態模型包括狀態圖和事件跟蹤圖。狀態圖是乙個狀態和事件的網路,側重於描述每一類物件的動態行為。事件跟蹤圖則側重於說明系統執行過程中的乙個特點 場景 也叫做指令碼 scenarios 是完成 系統某個功能的乙...