该问题的描述略。
LCS问题同样具有最优子结构(),子问题也出现重叠,但又有所不同——它可以根据条件来排除子问题。
建立一个二维数组res来存储LCS的长度,即res[i][j]表示长度为i的字符串X与长度为j的字符串Y的最长公共子序列的长度。经过分析可以得出如下公式:
res[i][j]=0 i=0或j=0;
res[i-1][j-1]+1 若i,j>0且X[i]=Y[j];
max(res[i-1][j],res[i][j-1]) 若i,j>0且X[i]!=Y[j];
根据这个公式有如下代码:
#include<iostream>
#include<string>
using namespace std;
int Lsc(string X, string Y) {
int res[10][10];
for (int i = 0; i < 10; i++) {
res[i][0] = 0;
res[0][i] = 0;
}
int m = X.size(), n = Y.size();//m,n均大于零。
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (X[i] == Y[j]) {
res[i][j] = res[i - 1][j - 1] + 1;
}
else if (res[i - 1][j] > res[i][j - 1]) {
res[i][j] = res[i - 1][j];
}
else
res[i][j] = res[i][j - 1];
}
}
return res[m][n];
}
int main() {
string X = { "abcbdab" };
string Y = { "bdcaba" };
cout << Lsc (X,Y)<< endl;
}