文章
150
粉丝
0
获赞
522
访问
22.2k
#include<bits/stdc++.h>
using namespace std;
// dp[i][j] 表示:字符串a的前i个字符 和 字符串b的前j个字符
// 的最长公共子序列长度
int dp[105][105];
int main(){
string a, b; // 两个输入字符串
// 初始化dp数组为0
// dp[0][j] 和 dp[i][0] 表示空字符串的LCS,都是0
memset(dp, 0, sizeof(dp));
cin >> a >> b;
int la = a.size(); // 字符串a的长度
int lb = b.size(); // 字符串b的长度
// 动态规划填表
// i从1开始,对应a的第i个字符(即a[i-1])
for(int i = 1; i <= la; ++i){
for(int j = 1; j <= lb; ++j){
// 情况1:当前字符相同
// a[i-1] == b[j-1],说明可以延长LCS
if(a[i-1] == b[j-1])
dp[i][j] = dp[i-1][j-1] + 1; // 继承之前的LCS长度,再+1
// 情况2:当前字符不同
// 只能取两种情况的最大值:
// - 不用a[i-1]:dp[i-1][j]
// - 不用b[j-1]:dp[i][j-1]
else
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
// 答案:两个完整字符串的LCS长度
cout << dp[la][lb] << endl;
return 0;
}
登录后发布评论
暂无评论,来抢沙发