在解決動態規劃問題時候, 關鍵的一點就是找到子問題, 在動態規劃中有一些常見的子問題模式,需要熟悉。下面就是一些常見子問題模式總結
在這種情況下,子問題是從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...