注意:兩個字串的最長公共子串(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...