動態規劃演算法理解

2021-06-27 22:44:52 字數 932 閱讀 5919

幾個月前已經弄懂了的演算法,現在回憶起來這麼費勁。又得重頭開始,真是浪費生命啊。再好的腦袋也不如爛筆頭!

這裡用最長公共子串行問題(lcs)來說明演算法: 給定兩個序列 

x = y =
求x、y長度最長的公共子串行。

前期儲備知識:公共子串行不等於公共字串(注意區分)。例如,如果x = ,y = ,那麼就是x和y的公共子串行,但不是最長公共子串行,才是最長公共子串行,當然也是最長公共子串行。

定理:令x = x1,x2,... ,xm 和 y = y1,y2, ..., yn為兩個序列,z= z1,z2,..., z為x和y的任意lcs。

1、如果xm = yn,則zk = xm = yn且zk-1是xm-1和yn-1的乙個lcs。

2、如果xm != yn,那麼zk != xm意味著z是xm-1和y的乙個lcs。

3、如果xm != yn,那麼zk != ym意味著z是x和yn-1的乙個lcs。

( 用反證法即可證明。對證明有疑問的可以去看演算法導論。)

定義c[i,j]表示xi和yj的lcs長度。如果i=0或j=0,即乙個序列長度為0,那麼lcs的長度為0。根據子結構的性質,則有如下表示式:

c[i,j]    =   0                       若i=0或j=0

= c[i-1,j-1] + 1 若i,j>0 且 xi = yi

= max(c[i,j-1],c[i-1,j]) 若i,j>0且xi != yi

ok,最關鍵的一步推導出了,根據該公式很容易推導出下面的圖(數字表示子串行的長度):

定義陣列b[m,n]來儲存子串行的長度,顯然b[0,0~n] = 0,b[0~m,0] = 0。

動態規劃演算法 理解

動態規劃 多階段 兩段 最優化決策解決問題的過程就稱為動態規劃。1 描述優解的結構特徵。2 遞迴地定義乙個最優解的值。3 自底向上計算乙個最優解的值。4 從已計算的資訊中構造乙個最優解。1 最優化原理 問題的最優解包含的字問題也有最優解,就稱該問題具有最優子結構,滿足最優化原理。單調遞增最長子序列 ...

理解動態規劃演算法

動態規劃的思想是將乙個問題分解為若干子問題,並且子問題之間還有重疊,通過先求解這些子問題的最優解,將原問題的最優解通過這些子問題的最優解構造出來,從而得到原問題的最優解。由此可以得到動態規劃演算法的應用場景 若求乙個問題的最優解 通常是求最大值或者最小值 而且該問題能夠分解成若干個子問題,並且子問題...

動態規劃演算法的理解

動態規劃演算法主要的核心思想是 狀態和狀態轉移方程。怎麼理解這個問題呢?先拿到了乙個數字三角形的程式,閱讀了它的動態規劃的 但是看不明白!不明白在什麼地方呢?在具體的執行過程各個變數的變化方向。比如兩層for迴圈,i為逆序,j為次序。那麼這種執行次序就沒有辦法想象了。那就先不管上面的了,先看dag上...