思路:
對所有子問題s1[1-i]和s2[1-j]進行求解。s1[1-i]表示1~i範圍的s1子串,s2[1-j]表示1-j範圍的s2子串。
舉例:
#define n1 8
#define n2 9
int s1[n1+1]
=;int s2[n2+1]
=;
其所有子問題如下:
s1[1~1],s2[1-1],求其最長公共子串行長度
s1[1~1],s2[1-2],求其最長公共子串行長度
s1[1~1],s2[1-2],求其最長公共子串行長度
s1[1~1],s2[1-3],求其最長公共子串行長度
s1[1~1],s2[1-4],求其最長公共子串行長度
s1[1~1],s2[1-5],求其最長公共子串行長度
s1[1~1],s2[1-6],求其最長公共子串行長度
s1[1~1],s2[1-7],求其最長公共子串行長度
s1[1~1],s2[1-8],求其最長公共子串行長度
s1[1~1],s2[1-9],求其最長公共子串行長度
s1[1~2],s2[1-1],求其最長公共子串行長度
s1[1~2],s2[1-2],求其最長公共子串行長度
s1[1~2],s2[1-3],求其最長公共子串行長度
s1[1~2],s2[1-4],求其最長公共子串行長度
s1[1~2],s2[1-5],求其最長公共子串行長度
s1[1~2],s2[1-6],求其最長公共子串行長度
s1[1~2],s2[1-7],求其最長公共子串行長度
s1[1~2],s2[1-8],求其最長公共子串行長度
s1[1~2],s2[1-9],求其最長公共子串行長度
s1[1~3],s2[1-1],求其最長公共子串行長度
s1[1~3],s2[1-2],求其最長公共子串行長度
s1[1~3],s2[1-3],求其最長公共子串行長度
s1[1~3],s2[1-4],求其最長公共子串行長度
s1[1~3],s2[1-5],求其最長公共子串行長度
s1[1~3],s2[1-6],求其最長公共子串行長度
s1[1~3],s2[1-7],求其最長公共子串行長度
s1[1~3],s2[1-8],求其最長公共子串行長度
s1[1~3],s2[1-9],求其最長公共子串行長度
s1[1~4],s2[1-1],求其最長公共子串行長度
s1[1~4],s2[1-2],求其最長公共子串行長度
s1[1~4],s2[1-3],求其最長公共子串行長度
s1[1~4],s2[1-4],求其最長公共子串行長度
s1[1~4],s2[1-5],求其最長公共子串行長度
s1[1~4],s2[1-6],求其最長公共子串行長度
s1[1~4],s2[1-7],求其最長公共子串行長度
s1[1~4],s2[1-8],求其最長公共子串行長度
s1[1~4],s2[1-9],求其最長公共子串行長度
s1[1~5],s2[1-1],求其最長公共子串行長度
s1[1~5],s2[1-2],求其最長公共子串行長度
s1[1~5],s2[1-3],求其最長公共子串行長度
s1[1~5],s2[1-4],求其最長公共子串行長度
s1[1~5],s2[1-5],求其最長公共子串行長度
s1[1~5],s2[1-6],求其最長公共子串行長度
s1[1~5],s2[1-7],求其最長公共子串行長度
s1[1~5],s2[1-8],求其最長公共子串行長度
s1[1~5],s2[1-9],求其最長公共子串行長度
s1[1~6],s2[1-1],求其最長公共子串行長度
s1[1~6],s2[1-2],求其最長公共子串行長度
s1[1~6],s2[1-3],求其最長公共子串行長度
s1[1~6],s2[1-4],求其最長公共子串行長度
s1[1~6],s2[1-5],求其最長公共子串行長度
s1[1~6],s2[1-6],求其最長公共子串行長度
s1[1~6],s2[1-7],求其最長公共子串行長度
s1[1~6],s2[1-8],求其最長公共子串行長度
s1[1~6],s2[1-9],求其最長公共子串行長度
s1[1~7],s2[1-1],求其最長公共子串行長度
s1[1~7],s2[1-2],求其最長公共子串行長度
s1[1~7],s2[1-3],求其最長公共子串行長度
s1[1~7],s2[1-4],求其最長公共子串行長度
s1[1~7],s2[1-5],求其最長公共子串行長度
s1[1~7],s2[1-6],求其最長公共子串行長度
s1[1~7],s2[1-7],求其最長公共子串行長度
s1[1~7],s2[1-8],求其最長公共子串行長度
s1[1~7],s2[1-9],求其最長公共子串行長度
s1[1~8],s2[1-1],求其最長公共子串行長度
s1[1~8],s2[1-2],求其最長公共子串行長度
s1[1~8],s2[1-3],求其最長公共子串行長度
s1[1~8],s2[1-4],求其最長公共子串行長度
s1[1~8],s2[1-5],求其最長公共子串行長度
s1[1~8],s2[1-6],求其最長公共子串行長度
s1[1~8],s2[1-7],求其最長公共子串行長度
s1[1~8],s2[1-8],求其最長公共子串行長度
s1[1~8],s2[1-9],求其最長公共子串行長度
所有子問題的答案都存在二維陣列m中。
利用二維陣列逆向輸出答案,具體過程直接看**就好。
**實現如下:
#include
using
namespace std;
intmain()
;int s2[n2+1]
=;int m[9]
[10]=
;for
(int i =
1; i <= n1; i++
)else
else}}
}// 輸出陣列m
for(
int i =
0; i <= n1; i++
)putchar(10
);}// 輸出答案
cout <<
"倒序輸出答案:"
;int i = n1, j = n2;
while
(i >=
1&& j >=1)
else
else}}
putchar(10
);return0;
}
參考: 演算法 最長公共子串行LCS
演算法 最長公共子串行 子串行的定義 如果z是a的子串行,則a中包含z的所有排列元素,且這些元素在各自排列中的順序是一致的 例如z a 最優子結構 設c是lcs的長度 則if i 0 j 0 c i,j 0 else if x i y j c i,j c i 1,j 1 1 else if x i ...
LCS演算法最長公共子串行
問題 求解x和y的最長公共子串行 解析先處理序列的前 公式 個元素組成的子串行,然後再依次往上加後面的元素。即,用 公式 表示序列1和序列2前 公式 個元素的lcs長度,然後將 公式 用 公式 至 公式 表示。但是這個拆分有個問題 序列1和序列2的長度可能不等。這個問題很好解決,我們可以在較短序列的...
LCS 最長公共子串行
問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...