最长公共子序列(15章:动态规划)。。。2014.6.2

来源:互联网 发布:光大证券软件下载 编辑:程序博客网 时间:2024/05/20 05:25
/*文件名:LCS.c*///最长公共子序列#include <STDLIB.H>#include <STDIO.H>#include <MATH.H>#define N 100typedef struct table{int c;//X[i],Y[j]的LCS长度.char b;//b[i][j]所指向的表项对应着计算c[i][j]时所选择的子问题的最优解.}table;table table1[N][N];//主要算法过程void LCS_LENGTH(char X[N],int m,char Y[N],int n){int i,j;for(i=0;i<=m;i++)table1[i][0].c=0;for (j=0;j<=n;j++)table1[0][j].c=0;//若i=0或者j=0则令c[i][j]==0.for (i=1;i<=m;i++){for (j=1;j<=n;j++){if (X[i]==Y[j]){table1[i][j].c=table1[i-1][j-1].c+1;table1[i][j].b='x';//所选子问题的最优解为斜向上那个}else if (table1[i-1][j].c>=table1[i][j-1].c){table1[i][j].c=table1[i-1][j].c;table1[i][j].b='u';//所选子问题的最优解为上面那个}else{table1[i][j].c=table1[i][j-1].c;table1[i][j].b='l';//所选子问题的最优解为左边那个}}}}//打印输出.//从右下角开始,沿着b的箭头走就可以了.void PRINT_LCS(table table1[N][N],char X[N],int i,int j){if(i==0||j==0)return ;if(table1[i][j].b=='x'){PRINT_LCS(table1,X,i-1,j-1);printf("%d",i);printf("%c  ",X[i]);}else if (table1[i][j].b=='u'){PRINT_LCS(table1,X,i-1,j);}elsePRINT_LCS(table1,X,i,j-1);}int main(){char X[N]={' ','A','B','C','B','D','A','B'};char Y[N]={' ','B','D','C','A','B','A'};LCS_LENGTH(X,7,Y,6);PRINT_LCS(table1,X,7,6);}

0 0
原创粉丝点击