#include <iostream>
#include <cstring>
using namespace std;const int MAXN = 1005;
int dp[MAXN][MAXN];int main()
{string s1, s2;cin >> s1 >> s2;int len1 = s1.length(), len2 = s2.length();memset(dp, 0, sizeof(dp)); // 初始化为0// 动态规划求解for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; 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[len1][len2] << endl; // 输出最长公共子序列的长度return 0;
}
该代码使用了动态规划的思想来解决最长公共子序列问题。dp[i][j]表示s1字符串前i个字符与s2字符串前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]);
}
如果s1[i-1] == s2[j-1],则说明s1[i-1]和s2[j-1]可以作为最长公共子序列的最后一个字符,此时dp[i][j]应该为dp[i-1][j-1]+1;否则,s1[i-1]和s2[j-1]不能同时作为最长公共子序列的最后一个字符,此时dp[i][j]应该为dp[i-1][j]和dp[i][j-1]中的最大值。最终,dp[len1][len2]就是最长公共子序列的长度。