最长公共子序列
1、问题定义
2、确定递归方程
用 C [ i ] [ j ] C[i][j] C[i][j]表示 x [ 1... i ] x[1...i] x[1...i] 和 y [ 1... j ] y[1...j] y[1...j]最长公共子序列的长度
初始化:
C
[
0
]
[
1...
m
]
=
0
C[0][1...m] = 0
C[0][1...m]=0 // x字符串长度为0的时候,与y[1…m]的公共子序列的长度为0
C
[
1...
n
]
[
0
]
=
0
C[1...n][0] = 0
C[1...n][0]=0 // y字符串长度为0的时候,与x[1…n]的公共子序列的长度为0
递归方程:
考虑两个字符串末尾的字符:
x
[
i
]
x[i]
x[i] 和
y
[
j
]
y[j]
y[j]
if(x[i] != y[j]):
C[i][j] = max(C[i-1][j], C[i][j-1])
else :
C[i][j] = C[i-1][j-1] + 1
填表格的方向:
3、代码实现
// poj1458
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int C[1010][1010];
int main()
{
char x[1010], y[1010]; // 题目没有给说数据的范围就很扯淡
while (cin >> x >> y) {
// cout << x << " " << y << endl;
//初始化
memset(C,0,sizeof(C));
int lx = strlen(x);
int ly = strlen(y);
for (int i = 0; i < lx; ++i) {
C[i][0] = 0;
}
for (int i = 0; i < ly; ++i) {
C[0][i] = 0;
}
//递推
for (int i = 1; i <= lx; ++i) {
for (int j = 1; j <= ly; ++j) {
if(x[i-1] == y[j-1]) //
C[i][j] = C[i-1][j-1] + 1;
else
C[i][j] = max(C[i-1][j], C[i][j-1]);
}
}
cout << C[lx][ly] << endl;
}
return 0;
}
4、课件的伪代码
如何记录找到的最长公共子序列:
觉得写的不错就点个赞吧 : )