//
// Created by CyIce on 2021/2/1.
//
//最长公共子序列
#include <iostream>
#include <algorithm>
#include <string>
#include <stdio.h>
using namespace std;
const int MAXN = 110;
//将A下标为i,B下标为j的状态保存在dp[i+1][j+1]中,便于定义边界dp[0][i]和dp[i][0]
int dp[MAXN][MAXN];
int main(){
string A,B;
while (cin>>A>>B){
//当A、B其中一个下标为0时,显然此时最长公共子序列长度为0
for (int i = 0; i < MAXN; ++i) {
dp[0][i] = dp[i][0] = 0;
}
for (int i = 0; i < A.size(); ++i) {
for (int j = 0; j < B.size(); ++j) {
if(A[i] == B[j]){ //当A[i] == B[j]时,此时最长公共子序列长度加1
dp[i+1][j+1] = dp[i][j]+1;
} else{ //当A[i] != B[j]时,此时最长公共子序列长度为此前所有状态的最大值
dp[i+1][j+1] = max(dp[i][j+1],dp[i+1][j]);
}
}
}
printf("%d\n",dp[A.size()][B.size()]);
}
return 0;
}
问题 A: 最长公共子序列
最新推荐文章于 2024-04-14 15:33:18 发布