动态规划之最长公共子序列的求解(C++实现)

<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>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值