1276:【例9.20】编辑距离
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 4302 通过数: 1761
【题目描述】
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符。
对任意的两个字符串A和B,计算出将字符串A变换为字符串B所用的最少字符操作次数。
【输入】
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
【输出】
只有一个正整数,为最少字符操作次数。
【输入样例】
sfdqxbw
gfdgw
【输出样例】
4
思路:
删除A[i] <=>在B[i]前 插入
在A[i]前插入与B[i]相同的元素 <=> 删除 B[i]
修改A[i] <=> 修改B[i]
这样的两种操作,都增加了一次操作次数,最终同样的结果
所以,我们只需要对一个串操作,最终的结果没有影响
只对B操作
f[i][j]表示要使A的前i个元素与B的前j个元素相同的最少操作次数
初始化
f[i][0] = i;
f[0][j] = j;
转移方程:
如果A[i]==B[i],不做修改,f[i][j] = f[i - 1][j - 1]
否则,三种修改方式,在B中加一个,f[i][j] = f[i - 1][j] + 1;
在B中删一个,f[i][j] = f[i][j - 1] + 1;
在B中改一个,f[i][j] = f[i - 1][j - 1] + 1;
三者取maxx
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#