1. 程式人生 > >最長遞增子列、最長公共子序列 python實現

最長遞增子列、最長公共子序列 python實現

DP演算法:

最長公共子序列:

把問題分成兩種情況來討論:

1. 如果S1[i] == S2[j]。就是i,j對應位置上的字元相等。那麼可以得出M[i,j] = M[i-1,j-1]+1;為什麼呢?可以想象的。如果M[i-1,j-1]也是一個最後方案,在這個最優方案上我們同時增加一個字元。而這兩個字元又相 等。那麼我們只需要在這個M[i-1,j-1]的最優方案上++就可以了。

2. 如果S1[i] != S2[j]。那麼就拿M[i-1,j]M[i,j-1]來比較。M[i,j]的值就是M[i-1,j]M[i,j-1]中大的值。這好比原來的字串 是S1[1...i-1]ABCS2[1...j-1]

ABE。那S1[1..i]ABCES2[1..j]ABEC。可以看出來這個時候 M[i,j]不是由M[i-1,j-1]決定的,而是由ABCEABE或者ABCABEC來決定的,也就是M[i-1,j]M[i,j-1]

所以我們可以把這個問題的遞迴式寫成:

最長遞增子列可以轉化為LCS求解   DP+排序

python實現程式碼: