码迷,mamicode.com
首页 > 其他好文 > 详细

最长公共子序列模板(LCS)模板

时间:2016-05-04 20:55:49      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

递归式:

技术分享

实例图解:

技术分享

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N=111;
 4 int dp[N][N],f[N][N];
 5 char a[N],b[N],c[N];
 6 void LCS(char *a,char *b,int la,int lb)
 7 {
 8     int i,j; 
 9     memset(dp,0,sizeof(dp));
10     for(i=1;i<=la;i++)
11     {
12         for(j=1;j<=lb;j++)
13         {
14             if(a[i-1]==b[j-1])
15             {
16                 dp[i][j]=dp[i-1][j-1]+1;
17                 f[i][j]=0;
18             }
19             else if(dp[i-1][j]>dp[i][j-1])
20             {
21                 dp[i][j]=dp[i-1][j];
22                 f[i][j]=-1;
23             }
24             else
25             {
26                 dp[i][j]=dp[i][j-1];
27                 f[i][j]=1;
28             }
29         }
30     }
31 }
32 void dfs(char *s,int i,int j)
33 {
34     if(!i||!j)  return ;
35     if(!f[i][j])
36     {
37         dfs(s,i-1,j-1);
38         printf("%c",s[i-1]);
39     }
40     if(f[i][j]==1)
41         dfs(s,i,j-1);
42     if(f[i][j]==-1)
43         dfs(s,i-1,j);
44 }
45 int main()
46 {
47     while(scanf("%s%s",a,b)!=EOF)
48     {
49         int la=strlen(a),lb=strlen(b);
50         LCS(a,b,la,lb);
51         printf("%s和%s的最长公共子序列为:\n",a,b);
52         dfs(a,la,lb); 
53         puts("");
54         printf("长度为:%d\n",dp[la][lb]);
55     }
56     return 0;
57 }

参考文章:http://blog.csdn.net/yysdsyl/article/details/4226630

最长公共子序列模板(LCS)模板

标签:

原文地址:http://www.cnblogs.com/L-King/p/5459690.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!