感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸

地址http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28195#overview

密码  acmore

Problem A HDU 1159 Common Subsequence

这算是LCS里面最简单了的吧

解题方法见http://www.cnblogs.com/gj-Acit/p/3236384.html

下面随便贴上两段代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAX(a,b) (a>b?a:b)
 4 
 5 char X[1002],Z[1002];
 6 int Com[1002][1002];
 7 
 8 int main()
 9 {
10     memset(X,0,sizeof(X));
11     memset(Z,0,sizeof(Z));
12     while(~scanf("%s%s", X, Z))
13     {
14         memset(Com,0,sizeof(Com));
15         int LenX = strlen(X), LenZ = strlen(Z);
16         for(int i=0;i<LenX;i++)
17         {
18             for(int j=0;j<LenZ;j++)
19             {
20                 if(X[i] == Z[j])Com[i+1][j+1] = Com[i][j]+1;
21                 else Com[i+1][j+1] = MAX(Com[i][j+1], Com[i+1][j]);
22             }
23         }
24         printf("%d\n",Com[LenX][LenZ]);
25     }
26     return 0;
27 }

下面这个空间复杂度要小一些

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAX(a,b) (a>b?a:b)
 4 
 5 char X[1002],Z[1002];
 6 int Com[2][1002];
 7 
 8 int main()
 9 {
10     memset(X,0,sizeof(X));
11     memset(Z,0,sizeof(Z));
12     while(~scanf("%s%s", X, Z))
13     {
14         memset(Com,0,sizeof(Com));
15         int LenX = strlen(X), LenZ = strlen(Z);
16         int key = 0;
17         for(int i=0;i<LenX;i++)
18         {
19             key = !key;
20             for(int j=0;j<LenZ;j++)
21             {
22                 if(X[i] == Z[j])Com[key][j+1] = Com[!key][j]+1;
23                 else Com[key][j+1] = MAX(Com[!key][j+1], Com[key][j]);
24             }
25         }
26         printf("%d\n",Com[key][LenZ]);
27         memset(X,0,sizeof(X));
28         memset(Z,0,sizeof(Z));
29     }
30     return 0;
31 }
View Code

相关文章: