演算法學習 動態規劃 求最長子序列

2021-09-10 07:52:09 字數 1784 閱讀 3312

對於母串x=, y=,求lcs與最長公共子串。

子串應該比較好理解,至於什麼是子串行,這裡給出乙個例子:有兩個母串

比如序列bo, bg, lg在母串cnblogs與belong中都出現過並且出現順序與母串保持一致,我們將其稱為公共子串行。最長公共子串行(longest common subsequence, lcs),顧名思義,是指在所有的子串行中最長的那乙個。子串是要求更嚴格的一種子串行,要求在母串中連續地出現。在上述例子的中,最長公共子串行為blog(cnblogs,belong),最長公共子串為lo(cnblogs, belong)

我們假設兩個字串的長度為m,n;lcs的長度為k;並且假設lcs裡面的所有字元都是滿足條件的

並且假設前k個都滿足情況了,我們討論第k個:

設xm=和yn=為兩個字串,而zk=是它們的lcs,則:

如果xm-1=yn-1,那麼zk-1=xm-1=yn-1,並且zk-1是xm-1和yn-1的lcs;

如果xm-1≠yn-1,那麼當zk-1≠xm-1時z是xm-1和y的lcs;

如果xm-1≠yn-1,那麼當zk-1≠yn-1時z是yn-1和x的lcs

dp方程:引進乙個二維陣列c,用c[i][j]記錄x[i]與y[j] 的lcs 的長度,b[i][j]記錄c[i][j]是通過哪乙個子問題的值求得的,以決定搜尋的方向。

我們是自底向上進行遞推計算,那麼在計算c[i,j]之前,c[i-1][j-1],c[i-1][j]與c[i][j-1]均已計算出來。此時我們根據x[i] = y[j]還是x[i] != y[j],就可以計算出c[i][j]。

0,i=0 or j=0

c[i-1,j-1]+1,  i,j>0 and xi=yj

max(c[i-1,j],c[i,j-1]),  i,j>0 and xi!=yj

動態規劃常常適用於有[重疊子問題]和[最優子結構]性質的問題

#include #include #define maxlen 100

void lcslength(char *x, char *y, int m, int n, int c[maxlen], int b[maxlen])

else if(c[i-1][j] >= c[i][j-1])

else}}

}void printlcs(int b[maxlen], char *x, int i, int j)

else if(b[i][j] == 1)

printlcs(b, x, i-1, j);

else

printlcs(b, x, i, j-1);

}int main(int argc, char **ar**)

;    char y[maxlen] = ;

int b[maxlen][maxlen];

int c[maxlen][maxlen];

int m, n;

m = strlen(x);

n = strlen(y);

lcslength(x, y, m, n, c, b);

printlcs(b, x, m, n);

return 0;

}

動態規劃 最長子序列

引出 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7 an,求它的乙個子串行 設為s1,s2,sn 使得這個子串行滿足這樣的性質,s1分析 這題目是經典的dp題目,也可叫作最長上公升子串行或者 最長不下降子串行。有兩種演算法,複雜度分別為o n logn 和o n 2 演算法1 時間...

動態規劃 最長子序列

引出 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7 an,求它的乙個子串行 設為s1,s2,sn 使得這個子串行滿足這樣的性質,s1分析 這題目是經典的dp題目,也可叫作最長上公升子串行或者 最長不下降子串行。有兩種演算法,複雜度分別為o n logn 和o n 2 演算法1 時間...

動態規劃最長子序列

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。兩個字串的...