51nod 1183 编辑距离 (经典dp)

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
 收藏
 关注
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
例如将kitten一字转成sitting:
sitten (k->s)
sittin (e->i)
sitting (->g)
所以kitten和sitting的编辑距离是3。俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。
给出两个字符串a,b,求a和b的编辑距离。
 
Input
第1行:字符串a(a的长度 <= 1000)。
第2行:字符串b(b的长度 <= 1000)。
Output
输出a和b的编辑距离
Input示例
kitten
sitting
Output示例
3

很显然当a和b都很小时,肉眼可以看出来答案,比如样例。
所以不妨考虑用自底向上记忆化搜索取最优解的方法,即dp.
设dp[i][j]表示长度为i的字符串a与长度为j的字符串b的编辑距离。
为啥这么设?
因为在自底向上的过程中,发生变化的量就是i和j。

AC代码:
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 char a[1015],b[1015];
 6 int dp[1015][1015];
 7 int main()
 8 {
 9 
10     cin>>a>>b;
11     int n=strlen(a),m=strlen(b);
12     //边界条件
13     for(int i=0;i<1005;++i)
14         dp[i][0]=dp[0][i]=i;
15     for(int i=1;i<=n;++i)
16         for(int j=1;j<=m;++j)
17     {
18         if(a[i-1]==b[j-1])
19             dp[i][j]=min(min(dp[i-1][j-1],dp[i-1][j]+1),dp[i][j-1]+1);
20         else
21             dp[i][j]=min(min(dp[i-1][j-1]+1,dp[i-1][j]+1),dp[i][j-1]+1);
22     }
23     cout<<dp[n][m]<<endl;
24     return 0;
25 }
View Code
原文地址:https://www.cnblogs.com/onlyli/p/7240393.html