問題描述:
最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
例如:x(a,b,c,b,d,a,b)
y(b,d,c,a,b,a)
那麼最長公共子串行就是:b,c,b,a
演算法設計:用動態規劃方法解決
最長公共子串行的結構:
設x = ,y = 及它們的最長子序列z = 則:
1、若 xm = yn , 則 zk = xm = yn,且z[k-1] 是 x[m-1] 和 y[n-1] 的最長公共子串行
2、若 xm != yn ,且 zk != xm , 則 z 是 x[m-1] 和 y 的最長公共子串行
3、若 xm != yn , 且 zk != yn , 則 z 是 y[n-1] 和 x 的最長公共子串行
子問題的遞迴結構:
當 i = 0 , j = 0 時 , c[i][j] = 0
當 i , j > 0 ; xi = yi 時 , c[i][j] = c[i-1][j-1] + 1
當 i , j > 0 ; xi != yi 時 , c[i][j] = max
還是以:x(a,b,c,b,d,a,b)
y(b,d,c,a,b,a) 為例
看下面的圖:
由上面的分析:我們得到的源**:
//最長公共子串行**模板 #include using namespace std; #define n 105 int dp[n+1][n+1]; char str1[n],str2[n]; //比較兩個數的大小 int maxx(int a,int b) return b; } //函式功能:獲取兩個字串的最長公共子串行的數目 //len1:字串1的長度 //len2:字串2的長度 int lcsl(int len1,int len2) for(i=1;i<=len1;i++) else } } return dp[len1][len2]; } int main(){ while(cin>>str1>>str2){ int len1=strlen(str1);//獲取字串1的長度 int len2=strlen(str2);//獲取字串2的長度 cout<
利用此模板能直接解決的題目:hdoj1159 :
最長公共子串行問題
給定整數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...