一、問題描述
最長公共子串行(longest common sequence)。什麼是子串行呢?即乙個給定的序列的子串行,就是將給定序列中零個或多個元素去掉之後得到的結果。子串行每個元素的下標嚴格遞增。
如上圖,給定的字串行: ,它的子串行示例: 即元素b,d,g,h被去掉後,保持原有的元素序列所得到的結果就是子串行。同理,,等都是它的子串行。
最長公共子串行(以下都簡稱lcs)即給定序列s1=,s2=,s1和s2的相同子串行,且該子串行的長度最長,即是lcs。s1和s2的其中乙個最長公共子串行是
二、問題分析
1.最優子結構:設有序列x={x1,x2,…,xm}和y={y1,y2,…,yn},它們的最長公共子串行是z={z1,z2,…zk},則:
①若xm=yn,則zk=xm=yn,且zk-1是xm-1和yn-1的最長公共子串行;
②若xm!=yn,且zk!=xm,則z是xm-1和y的最長公共子串行;
③若xm!=yn,且zk!=yn,則z是x和yn-1的最長公共子串行;
其中xm-1={x1,x2,…,xm-1},yn-1={y1,y2,…,yn-1},zk-1={z1,z2,…zk-1};
2.子問題的遞迴結構:c[i][j]記錄序列xi和yj的最長公共子串行的長度;
//序列x長度xl+1,序列y長度yl+1,
//c[i][j]記錄子串行xi和yj的最長公共子串行長度,
//b[i][j]記錄c[i][j]的值是由哪乙個子問題得到的
void lcslength(int xl,int yl,char x,char y,int c[m][n],int b[m][n])
{ for(int i=0;i複雜性分析:o(n^2);
經典問題之最長公共子串行
nyoj 36 最長公共子串行 方法一 先選擇狀態的儲存結構,即最優子問題,用f i,j 表示字串a的前i位和字串b的前j位的最長公共子串行.階段 很明顯共有strlen a 個階段 每個狀態的決策 if a i a j f i,j f i 1,j 1 1 else f i,j max f i 1,...
演算法設計之最長公共子串行(LCS)問題
先解釋一下什麼是動態規劃,動態規劃的英文名字是 dynamic programming 首先要說明的是這裡的 programming 和程式設計裡面的程式設計沒有關係,而是指 查詢法 tabular method 即將每一步計算的結果儲存在 裡,供隨後的計算查詢使用。有動態規劃的名字可以看出它和分而...
動態規劃之最長公共子串行演算法
動態規劃之最長公共子串行演算法 演算法思想 假設x x1,x2,xm y static void init xy void getchar for i 1 i n i getchar static void lcs length void else if c i 1 j c i j 1 else p...