您的位置:首页 > 其它

最长公共子序列(LCS) (动态规划算法实现)算法导论p211

2011-11-16 15:31 453 查看
#include<stdio.h>

#include<string.h>

int max[101][101];

int flag1[101],flag2[101];

typedef struct

{

int i;

int j;

}point;

point sign[101][101];

char ch1[101],ch2[101];

void LCS_LENGH(int len1,int len2)

{

int i,j;

for(i=0;i<=len1;i++)//max,sign 的两边初始化

sign[i][0].i=max[i][0]=0;

for(j=0;j<=len2;j++)

sign[0][j].j=max[0][j]=0;

for(i=1;i<=len1;i++)//每一个进行配备

for(j=1;j<=len2;j++)

{

if(ch1[i]==ch2[j])//行和列的字符匹配上 则进行标记

{

max[i][j]=max[i-1][j-1]+1; //斜上加1

sign[i][j].i=i-1; //路劲标记为为 斜上的坐标

sign[i][j].j=j-1;

}

else if(max[i-1][j]>=max[i][j-1])

{

max[i][j]=max[i-1][j];

sign[i][j].i=i-1; //路劲标记为为 正左的坐标

sign[i][j].j=j;

}

else

{

max[i][j]=max[i][j-1];

sign[i][j].i=i; //路劲标记为为 正上边的坐标

sign[i][j].j=j-1;

}

}

}

void print(int len1,int len2)

{

int i,j,tempi;

for(i=1;i<=len1;i++)//输出max值

{

flag1[i]=0;

for(j=1;j<=len2;j++)

{

flag2[j]=0;

printf("%d ",max[i][j]);

}

printf("\n");

}

printf("\n");

for(i=1;i<=len1;i++)//输出路劲

{

for(j=1;j<=len2;j++)

printf("%d %d ",sign[i][j].i,sign[i][j].j);

printf("\n");

}

printf("\n");

i=len1;

j=len2;

while(i!=0||j!=0)//max中最大LCS 路径寻踪

{

if((i==sign[i][j].i+1)&&(j==sign[i][j].j+1))

{

flag1[i]=1;

flag2[j]=1;

}

tempi=i;

i=sign[i][j].i;

j=sign[tempi][j].j;

}

printf("%s\n",ch1+1);

for(i=1;i<=len1;i++)//标下标线

{

if(flag1[i]==0)

printf(" ");

else

printf("_");

}

printf("\n");

printf("%s\n",ch2+1);

for(j=1;j<=len2;j++)

{

if(flag2[j]==0)

printf(" ");

else

printf("_");

}

printf("\n");

}

int main()

{ freopen("1.txt","r",stdin);

gets(ch1+1);

gets(ch2+1);

int len1,len2;

len1=strlen(ch1+1);

len2=strlen(ch2+1);

LCS_LENGH(len1,len2);

print(len1,len2);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐