最长公共子序列(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;
}
#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;
}
相关文章推荐
- Java实现算法导论中最长公共子序列(LCS)动态规划法
- 【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS),字符串相似度算法
- 算法学习心得——动态规划法实现最长公共子序列(LCS)
- 算法导论(LCS最长公共子序列)
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)
- 算法导论 最长公共子序列的c程序实现带主函数
- LCS问题实现---------------(动态规划, 取自算法导论)
- 动态规划实现最长公共子序列(LCS)算法
- 【算法导论学习-29】动态规划经典问题02:最长公共子序列问题(Longest common subsequence,LCS)
- 【算法导论实验4】动态规划-最长公共子序列LCS
- 转【算法之动态规划(三)】动态规划算法之:最长公共子序列 & 最长公共子串(LCS)&字符串相似度算法
- 算法12—动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 算法学习 - 最长公共子序列(LCS)C++实现
- 矩阵链乘法(最小乘法数) (动态规划算法实现)算法导论p201
- 【经典算法】:最长公共子序列(LCS问题,用遍历实现)
- 算法导论 习题6.2-5 用迭代法实现堆排序
- 算法导论-第12章-二叉搜索树:随机二叉搜索树数据结构C++实现(前中后序遍历,插入,搜索,前后毗邻元素,最大最小值)
- 【算法导论】c++实现堆排序
- 算法面试题(二)-- 最长公共子序列(LCS)与苦恼的月下老人