DP编辑距离

俄罗斯科学家Vladimir Levenshtein在1965年提出了编辑距离概念。

编辑距离,又称Levenshtein距离,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的三种编辑操作包括插入一个字符、删除一个字符、将一个字符替换成另一个字符。 至今,编辑距离一直在相似句子检索的领域中发挥着不可忽视的作用。 

如果是: 
abcde 
acefg 
最优对齐状态是: 
abcde 
a  c  efg 
没有对上的列数是4,函数输出值为4。

状态转移方程是:d[i][j] = min{ d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+(a[i]==b[j]? 0:1) }

你看懂啦吗?

d[i][j]表示s1的前i个和s2的前j个字符相等。

初始状态为d[i][0]=i;d[0][i]=i;

(1)d[i-1][j]表示s1的前i-1个字符和s2的前j个字符已经相同啦,此时可以在s1的后面加上s2的最后一个字符或者把s2最后的字符去掉,即此时d[i][j]=d[i-1][j]+1;

(2)d[i][j-1]和(1)相同;

(3)d[i-1][j-1]时分两种情况

当s1[i]==s2[j]时,d[i][j]=d[i-1][j-1];

当s1[i]!=s2[j]时,d[i][j]=d[i-1][j-1]+1;

 Hrbust 1284

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 char  s1[1005],s2[1005];
 7 int dp[1005][1005];
 8 int main()
 9 {
10     int n;
11     cin>>n;
12     while(n--)
13     {
14         cin>>s1+1>>s2+1;
15         int l1=strlen(s1+1);
16         int l2=strlen(s2+1);
17         dp[0][0]=0;
18         for(int i=1;i<=l1;i++){
19             dp[i][0]=i;
20         }
21         for(int i=1;i<=l2;i++){
22             dp[0][i]=i;
23         }
24         for(int i=1; i<=l1; i++)
25         {
26             for(int j=1; j<=l2; j++)
27             {if(s1[i]==s2[j])//if一定要紧接着for,顺序错啦就不对啦哦
28                         dp[i][j]=dp[i-1][j-1];
29                     else dp[i][j]=dp[i-1][j-1]+1;
30                dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
31                 dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
32 
33 
34 
35 
36             }
37         }
38         cout<<dp[l1][l2]<<endl;
39     }
40     return 0;
41 }
View Code
你若盛开,清风自来...
原文地址:https://www.cnblogs.com/shangjindexiaoqingnian/p/5749168.html