动态规划实现最长公共子序列

来源:互联网 发布:软件需求确认表 编辑:程序博客网 时间:2024/05/21 22:48
#include <iostream>using namespace std;int c[100][100];int b[100][100];//标示最长子序列void LCS_length(char *X,char *Y,int X_len,int Y_len){int i,j;for (i=0;i<=X_len;i++){c[i][0]=0;}for (j=0;j<=Y_len;j++){c[0][j]=0;}for (i=1;i<=X_len;i++){for (j=1;j<=Y_len;j++){if (X[i]==Y[j]){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;//向左}}}}void Print_LCS(char *X,int X_len,int Y_len){if (X_len==0||Y_len==0){return;}if (b[X_len][Y_len]==1){Print_LCS(X,X_len-1,Y_len-1);cout<<X[X_len];}else if (b[X_len][Y_len]==2){Print_LCS(X,X_len-1,Y_len);}else{Print_LCS(X,X_len,Y_len-1);}}int main(){char *X,*Y;X=" abcbdab";//前面留着一个空字符为了串从1开始。Y=" bdcaba";int X_len=strlen(X)-1;int Y_len=strlen(Y)-1;LCS_length(X,Y,X_len,Y_len);cout<<"最长公共子序列长度为:"<<c[X_len][Y_len]<<endl;cout<<"输出最长公共子序列:";Print_LCS(X,X_len,Y_len);cout<<endl;}

算法导论书中简单实现。其中书中对最长序列标记方法挺值得借鉴。
0 0