感觉这个专题真不好捉,伤心了,慢慢啃吧,孩纸
地址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 }