<span style="font-size:24px;">// LCS.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "string.h"
#include "iostream"
using namespace std;
#define M 100
#define N 100
int lcsLength(char* X,char* Y);//求解两个序列的最长公共子序列的长度。
void lcs(int b[][N], char* X, int i, int j);//利用求得的数据结构 b[][],帮助构建最长公共子序列。
int b[M][M]={0};//用于帮助构造最优解。
int _tmain(int argc, _TCHAR* argv[])
{
char*X ="10010101";
char*Y ="010110110";
cout<<"序列1: "<<X<<endl
<<"序列2: "<<Y<<endl
<<"最长公共子序列的长度 : "
<<lcsLength(X,Y)<<endl;
cout <<"最长公共子序列: ";
lcs(b,X,strlen(X),strlen(X));
cout<<endl;
return 0;
}
int lcsLength(char* X,char* Y)
{
intc[M][N]={0},//c[i,j]表示 X[i] 和 Y[j] 的 LCS 长度。
m = strlen(X),
n = strlen(Y);
for(int i=1; i <= m; i++)
for(int j = 1; j <= n; j++)
{
if(X[i-1]==Y[j-1])
{
c[i][j] = c[i-1][j-1] + 1;
b[i][j] = 2;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j] = c[i-1][j];
b[i][j] = 1;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] =3;
}
}
return c[m][n];
}
void lcs(int b[][N], char* X, int i, int j)
{
if(i == 0 || j == 0)return;
if( b[i][j] ==2)
{
lcs(b,X,i-1,j-1);
cout<<X[i-1];
}
else if(b[i][j] ==1)
lcs(b,X,i-1,j);
else
lcs(b,X,i,j-1);
}</span>
动态规划之最长公共子序列的求解(C++实现)
最新推荐文章于 2024-04-14 15:33:18 发布