思路:
对所有子问题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] = {0,1,3,4,5,6,7,7,8 };
int s2[N2+1] = {0,3,5,7,4,8,6,7,8,2 };
其所有子问题如下:
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 <iostream>
using namespace std;
int main()
{
#define N1 8
#define N2 9
int s1[N1+1] = {0,1,3,4,5,6,7,7,8 };
int s2[N2+1] = {0,3,5,7,4,8,6,7,8,2 };
int m[9][10] = { 0 };
for (int i = 1; i <= N1; i++) {
for (int j = 1; j <= N2; j++) {
if (s1[i] == s2[j]) {
m[i][j] = m[i-1][j-1] + 1;
}else{
if (m[i - 1][j] > m[i][j - 1]) {
m[i][j] = m[i-1][j];
}
else {
m[i][j] = m[i][j-1];
}
}
}
}
// 输出数组m
for (int i = 0; i <= N1; i++) {
for (int j = 0; j <= N2; j++) {
cout << m[i][j] << " ";
}
putchar(10);
}
// 输出答案
cout << "倒序输出答案:";
int i = N1, j = N2;
while (i >= 1 && j >= 1) {
if (s1[i] == s2[j]) {
cout << s1[i] << " ";
i--; j--;
}
else {
if (m[i - 1][j] > m[i][j - 1]) {
i--;
}
else {
j--;
}
}
}
putchar(10);
return 0;
}
参考:https://blog.csdn.net/UncleJokerly/article/details/79701073