動態規劃公共子問題模式總結

2022-08-31 15:51:16 字數 1774 閱讀 1928

在解決動態規劃問題時候, 關鍵的一點就是找到子問題, 在動態規劃中有一些常見的子問題模式,需要熟悉。下面就是一些常見子問題模式總結

在這種情況下,子問題是從x1~xi這一部分。

子問題的個數一般為n, 所以用乙個dp[n]的陣列就能把子問題的解儲存

此題利用的就是求當前的dp[i], 要用到前面的dp[i-1]和dp[i-2]. 也就是說子問題是由前面的x1~xi-1得到的。

class solution 

//到達樓梯終點的最小cost 就是倒數第一層和第二層的最小cost值

在這種情況下, 子問題個數一般為m * n, 所以用dp[m][n]就能把子問題的解儲存

部落格位址

輸入為兩個字串, 也就是x1 ··· xm , y1 ··· yn ,解的結果是在兩個字串前面的子字串產生。

class solution 

for(

int i =

0; i <= size2; i++

)for

(int i =

1; i <= size1; i++

) count[i]

[j]=

min(count[i-1]

[j]+

1, count[i]

[j-1]+

1); count[i]

[j]=

min(count[i]

[j], tag+count[i-1]

[j-1])

;}}return count[size1]

[size2];}

};

這種情況子問題是 中間的一部分, 所以情況是n*n, 子問題的個數為n^2, 所以用**dp[n][n]**就能把子問題的解儲存

例子:矩陣鏈式相乘

假設有4個矩陣a,b,c,d, 每個矩陣的維度依次是50 * 20, 20 * 1, 1 * 10, 10 * 100, 在計算a * b * c * d 的過程中我們可能會利用矩陣相乘的結合率來優化計算,比如我們可能會這樣計算 (a * b * c) * d 或者 a * ( b * c )* d , 會得到很多種計算方式,其中有沒有什麼方式計算量最少呢?

我們可以看到

不同方式會產生巨大差異

其實我們可以把不同的計算順序看成一顆二叉樹, 例如

那麼子問題就是這個樹的子樹 動態規劃就變成了求子樹的最優值。

動態規劃公共子問題模式總結

在解決動態規劃問題時候,關鍵的一點就是找到子問題,在動態規劃中有一些常見的子問題模式,需要熟悉。下面就是一些常見子問題模式總結 在這種情況下,子問題是從x1 xi這一部分。子問題的個數一般為n,所以用乙個dp n 的陣列就能把子問題的解儲存 此題利用的就是求當前的dp i 要用到前面的dp i 1 ...

動態規劃 最常公共子串行問題

前面一篇博文動態規劃 矩陣連乘問題,學習了什麼是動態規劃,以及什麼時候該用動態規劃,總得來說就是 當乙個問題可以被分成若干個子問題求解,且子問題可以優化子結構,存在子問題重複的時候,就可以使用動態子結構。最長公共子串行的定義 設 兩個序列分別為 x y 他們的最長公共子串行為 z 那麼就存在下面這幾...

公共子串(動態規劃)

description 設有a b兩個字串,找出a b共同子串,每個字串無相同字元,可以不連續,但順序不能顛倒。input 第一行字串a 第二行字串 output 最長公共子串的長度.sample input abcfbc abfcab sample output 4解題思路 c i,j 表示序列x...