标签:
1 /* 2 ========最长公共子序列======== 3 所用算法 动态规划 4 作者 程松 5 时间 2015/12/11 16:43 6 所用语言 c++ 7 */ 8 #include<iostream> 9 #include<cstring> 10 #include<string> 11 using namespace std; 12 const int MAX_LENGTH = 1000;//定义字符串最大长度 13 int c[MAX_LENGTH][MAX_LENGTH];//长度为i的字符串x与长度为j的字符串的最长公共子序列长度 14 int b[MAX_LENGTH][MAX_LENGTH];//做标记 15 string x,y; 16 int x_length,y_length; 17 void init(){ 18 cin>>x; 19 cin>>y; 20 x_length = x.size(); 21 y_length = y.size(); 22 c[0][0]=-1;//以下循环i,j从1开始需单独让c[0][0]为-1,最初因此原因导致错误,勿忘勿忘 23 for(int i=1;i<=x_length;++i){ 24 for(int j=1;j<=y_length;++j){ 25 c[i][j] = -1;//未计算过设为-1,用作备忘录 26 b[i][j] = 0; 27 } 28 } 29 } 30 int LCSLength(int i,int j,string x,string y){ 31 int maxlength; 32 //记录此时的长度,做备忘录 33 if(c[i][j]!=-1){ 34 maxlength = c[i][j]; 35 } 36 //以下通过最优子结构求解 37 else if(i==0&&j==0){//边界条件, 38 maxlength = 0; 39 } 40 //以下为状态转移方程的实现 41 else if(x[i-1]==y[j-1]){ 42 maxlength = LCSLength(i-1,j-1,x,y)+1; 43 b[i][j] = 1; 44 }else if(LCSLength(i-1,j,x,y)>=LCSLength(i,j-1,x,y)){ 45 maxlength = LCSLength(i-1,j,x,y); 46 b[i][j] = 2; 47 }else{ 48 maxlength = LCSLength(i,j-1,x,y); 49 b[i][j] = 3; 50 } 51 c[i][j] = maxlength; 52 return maxlength; 53 } 54 //LCS()用来求解出最长的序列并将其输出 55 void LCS(int i,int j,string x){ 56 if(i==0||j==0) 57 return; 58 else if(b[i][j]==1){ 59 LCS(i-1,j-1,x); 60 cout<<x[i-1]; 61 }else if(b[i][j]==2){ 62 LCS(i-1,j,x); 63 }else{ 64 LCS(i,j-1,x); 65 } 66 } 67 int main(){ 68 init(); 69 cout<<LCSLength(x_length,y_length,x,y)<<endl; 70 LCS(x_length,y_length,x); 71 return 0; 72 }
标签:
原文地址:http://www.cnblogs.com/chengsong/p/5060109.html