设答案为ans
无论是删除、添加、修改某个字符都会让A串与B串减少一个字符的差异
则只需要通过这三种操作逐步减少字符的差异即可将A串变成B串
而在进行操作时原来相同的部分不需要被修改
且进行操作时不是修改相同的部分就是修改不相同的部分
则 ans=max(len1,len2)+LCS(A,B)
其中 len1,len2 分别为A,B两串的可见长度
附上代码 用了滚动数组压缩空间 (怎么才10pt)
#include <iostream>
#include <cstring>
#define MAXN 2005
using namespace std;
int len1, len2;
char a[MAXN], b[MAXN];
int LCS()
{
int dp[2][MAXN];
for (int i1 = 0; i1 < len1; i1++)
{
memcpy(dp[0], dp[1], sizeof(dp[1]));
for (int i2 = 0; i2 < len2; i2++)
{
if (i1 == 0 || i2 == 0)
dp[1][i2] = (a[i1] == b[i2]);
else if (a[i1] == b[i2])
dp[1][i2] = dp[0][i2 - 1] + 1;
else
dp[1][i2] = max(dp[0][i2], dp[1][i2 - 1]);
}
}
return dp[1][len2 - 1];
}
int main()
{
cin >> a >> b;
len1 = strlen(a);
len2 = strlen(b);
int max_len = len1 > len2 ? len1 : len2;
int lcs = LCS();
cout << max_len - lcs;
return 0;
}