题意:LCS……最长公共子序列……不想解释了
解法:这题只需要求长度,所以显而易见(对没错我就是来装×的),方程为dp[i][j] = {dp[i - 1][j - 1] + 1(s1[i] == s2[i]), max(dp[i - 1][j], dp[i][j - 1])}。
好吧还是解释一下……dp[i][j]表示两个字符串分别以第i个元素和第j个元素结尾时的LCM长度,如果第一个字符串的第i个字符和第二个字符串的第j个字符相等,那么dp[i][j]由dp[i - 1][j - 1]转移而来,否则dp[i][j]为dp[i][j - 1]和dp[i - 1][j]的最大值。
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; int dp[1005][1005]; int main() { string s1, s2; while(cin >> s1 >> s2) { memset(dp, 0, sizeof dp); for(int i = 1; i <= s1.size(); i++) { for(int j = 1; j <= s2.size(); j++) { if(s1[i - 1] == s2[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[s1.size()][s2.size()] << endl; } return 0; }