51nod1183
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。

跟最长公共子序列有点像,状态转移方程最小编辑距离_i++

最小编辑距离_#define_02 ================== 增删字符
最小编辑距离_#define_03 ================== 增删字符
最小编辑距离_编辑距离_04======= 相同不增加操作,不相同改为相同增加操作1.

字符数组留第一个位置空,容易写dp转移方程

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define d(x) cout << (x) << endl
#pragma GCC diagnostic error "-std=c++11"
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 1e3 + 10;

char a[N]; //a b 数组下标从1开始存字符串
char b[N];
int dp[N][N]; //dp[i][j]代表 a前i字符 与 b 前j字符 最小编辑距离

int editlen()
{
int len1 = strlen(a + 1);
int len2 = strlen(b + 1);
for(int i = 1; i <= len1; i++){
for (int j = 1; j <= len2; j++){
dp[i][j] = INF; //初始化无限大
}
}
for (int i = 1; i <= len2; i++){
dp[i][0] = i; //将i个字符全部删除
}
for (int j = 1; j <= len2; j++){
dp[0][j] = j; //将j个字符全部删除
}
int tag;
for (int i = 1; i <= len1; i++){
for (int j = 1; j <= len2; j++){
tag = (a[i] == b[j] ? 0 : 1);
dp[i][j] = min(dp[i][j - 1] + 1, min(dp[i - 1][j] + 1, dp[i - 1][j - 1] + tag));
}
}
return dp[len1][len2];
}

int main()
{
scanf("%s", a + 1);
scanf("%s", b + 1);
printf("%d\n", editlen());
return 0;
}