现在的位置: 首页 > 综合 > 正文

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

2013年09月06日 ⁄ 综合 ⁄ 共 1646字 ⁄ 字号 评论关闭

 

#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;
}

【上篇】
【下篇】

抱歉!评论已关闭.