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

来源:互联网 发布:淘宝换货要申请吗 编辑:程序博客网 时间:2024/05/01 14:07
<span style="font-size:24px;">// LCS.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "string.h"#include "iostream"using namespace std;#define M 100#define N  100int 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);elselcs(b,X,i,j-1);}</span>

0 0
原创粉丝点击