Common Subsequence(最长公共子序列DP)
题意简述:求两个字符串的最长公共子序列的长度
思路:最经典的最长公共子序列的长度(LCS问题)。动态转移方程如下:字符串X和字符串Y,dp[i][j]表示的是X的前i个字符和Y的前j个字符的最长公共子序列长度。如果
X[i]==Y[j],那么新的LCS+1;如果X[i]!=Y[j],则分别考察dp[i-1][j],和dp[i][j-1],区较大者即可。
#include <iostream> #include <string> #include <cmath> using namespace std; const int MAX=500; int dp[MAX][MAX]={0}; int main() { int len1,len2; string str1,str2; while(cin>>str1>>str2) { len1=str1.length(); len2=str2.length(); for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) //状态转移方程 if(str1[i-1]==str2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); cout<<dp[len1][len2]<<endl; } return 0; }