最长公共子序列
/*
最长公共子序列
*/
#include<iostream>
#include<string>
#define max(x, y) a>b?a:b
#define For(t, i, j) for(t = i; t <= j; t++)
#define MAXM 100
#define MAXN 100
using namespace std;
int c[MAXM][MAXN], b[MAXM][MAXN];
string x, y;
void Print_LCS(int i, int j)
{
if(i == 0 || j == 0) return;
if(b[i][j] == 1)
{
Print_LCS(i-1, j-1);
cout<<x[i-1];
}
else if(b[i][j] == 2)
Print_LCS(i-1, j);
else
Print_LCS(i, j-1);
}
void LCS()
{
int i, j, m = x.length(), n = y.length();
For(i, 0, m) c[i][0] = 0;
For(j, 0, n) c[0][j] = 0;
For(i, 1, m)
For(j, 1, n)
{
if(x[i-1] == y[j-1])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 1;//左上
}
else if(c[i-1][j] >= c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = 2;//正上
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = 3;//左
}
}
cout<<"最长为:"<<c[m][n]<<endl;
Print_LCS(m, n);
cout<<endl;
}
int main()
{
// abcbdab bdcaba
cin>>x>>y;
LCS();
system("pause");
return 0;
}
世上无难事,只要肯登攀。

浙公网安备 33010602011771号