例題分享 最長公共子串行問題 LCS

2021-08-29 22:48:22 字數 1647 閱讀 2140

注意:兩個字串的最長公共子串(dp)與最長公共子串行(lcs)的區別:

最長公共子串要求在原字串中是連續的,而子串行只需要保持相對順序一致,並不要求連續。

根據standford《演算法導論》課程的方法一共有3種辦法

暴力窮舉法,這個不用說了都知道。

動態遞迴,也就是利用遞迴思路,自上而下。從m ->0。

備忘表法,自下而上(自底向上)。從0 ->m。備忘表法會丟到一些內容

2/3無論哪乙個都是利用同乙個核心:狀態轉移方程。(從別人的文章中看到的,我也忘記是**帶來的了。)

f (m

,n)=

0,& m=0||n=0\\ f(m-1,n-1) +1, &a[m]=b[n]\\ max(f(m-1,n),f(m-1,n)),&a[m] \neq b[n] \end

f(m,n)

=⎩⎪⎨

⎪⎧​0

,f(m

−1,n

−1)+

1,ma

x(f(

m−1,

n),f

(m−1

,n))

,​m=

0∣∣n

=0a[

m]=b

[n]a

[m]̸

​=b[

n]​

#include #include #include #include #include #include using namespace std;

#define max_x 1000

#define max_y 1000

string result[max_x][max_y];//由於c++中字串自動初始化為"",不能判斷是否為空,所以需要另外乙個**來判斷是否已經有值了

bool bresult[max_x][max_y];//用來判斷是否已經有值了。

string maxstring(string a, string b)

string maxcommonstring(string a, string b)

if (1 == lena)

else

return result[lena - 1][lenb - 1];

} if (1 == lenb)

else

return result[lena - 1][lenb - 1];

} //進入遞迴。

if (a[lena - 1] == b[lenb - 1])

result[lena - 1][lenb - 1] = result[lena - 2][lenb - 2] + a[lena - 1];

bresult[lena - 1][lenb - 1] = true;

} else

if (false == bresult[lena - 1][lenb - 2])

result[lena - 1][lenb - 1] = maxstring(result[lena - 1][lenb - 2], result[lena - 2][lenb - 1]);

bresult[lena - 1][lenb - 1] = true;

} return result[lena - 1][lenb - 1];

}int main()

最長公共子串行問題

給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...

最長公共子串行問題

最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...

最長公共子串行問題

問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...