对于一个字符串而言:
字串是指在该字符串中取出连续的一块
子序列是指在该字符串中删去若干元素后得到的序列
给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。最长公共子序列是长度最长的子序列。
LCS问题:给定两个序列X和Y,找出X和Y的一个最长公共子序列。
一:当Xi=Yj时,找出Xi-1=Yj-1的最长公共子序列,然后在其尾部加上Xi即可得到X和Y的最长公共子序列。
二:当Xi≠Yj时,
1.找到Xi-1和Yj的最长公共子序列。
2.找到Xi和Yj-1的最长公共子序列。
3.取两者最大值。
练习:hdu1159:http://acm.hdu.edu.cn/showproblem.php?pid=1159
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 string str1; 4 string str2; 5 int dp[1005][1005]; 6 int main(int argc, char const *argv[]) 7 { 8 while(cin>>str1>>str2) 9 { 10 memset(dp,0,sizeof(dp)); 11 for (int i = 1; i <= str1.length(); ++i) 12 { 13 for (int j = 1; j <= str2.length(); ++j) 14 { 15 if (str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1; 16 else dp[i][j]=max(dp[i][j-1],dp[i-1][j]); 17 } 18 } 19 cout<<dp[str1.length()][str2.length()]<<endl; 20 } 21 return 0; 22 }