求助、可不可以这样思考
  • 板块P2758 编辑距离
  • 楼主msgjn
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/2/3 19:54
  • 上次更新2025/2/4 10:12:32
查看原帖
求助、可不可以这样思考
1530702
msgjn楼主2025/2/3 19:54

设答案为ans
无论是删除、添加、修改某个字符都会让A串与B串减少一个字符的差异
则只需要通过这三种操作逐步减少字符的差异即可将A串变成B串
而在进行操作时原来相同的部分不需要被修改
且进行操作时不是修改相同的部分就是修改不相同的部分
ans=max(len1,len2)+LCS(A,B)ans = max(len1, len2) + LCS(A, B)
其中 len1,len2len1, 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;
}
2025/2/3 19:54
加载中...