codevs 2598 编辑距离问题

来源:互联网 发布:程序员年纪大了怎么办 编辑:程序博客网 时间:2024/05/22 15:20

题目描述 Description

设A和B是2个字符串。要用最少的字符操作将字符串A转换为字符串B。这里所说的字符操作包括:
(1)删除一个字符;
(2)插入一个字符;
(3)将一个字符改为另一个字符。
将字符串A变换为字符串B所用的最少字符操作数称为字符串A到B的编辑距离,记为d(A,B)。试编写程序,对任给的2个字符串A和B,计算出它们的编辑距离d(A,B)。

输入描述 Input Description

输入有两行,第一行是字符串A,第二行是字符串B。

输出描述 Output Description

输出文件只有一行,即编辑距离d(A,B)。

样例输入 Sample Input

fxpimu
xwrs

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

40%的数据字符串A、B的长度均不超过100;
100%的数据字符串A、B的长度均不超过4000。

定义 dp[i][j]代表A串前i个字符,B串前j个字符的编辑距离。
当s1[i]!=s2[j]时
dp[i-1][j-1]+1 修改s1[i]为s2[j]
dp[i-1][j]+1 删除s1[i]
dp[i][j-1]+1 删除s2[j]
状态转移方程就出来了

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int dp[5010][5010];char s1[5010],s2[5010];int main(){    scanf("%s",s1+1);    scanf("%s",s2+1);    int len1=strlen(s1+1),len2=strlen(s2+1);    for(int i=1;i<=len1;i++) dp[i][0]=i;    for(int i=1;i<=len2;i++) dp[0][i]=i;    dp[0][0]=0;    for(int i=1;i<=len1;i++)        for(int j=1;j<=len2;j++)            if(s1[i]!=s2[j])                dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i][j-1]+1,dp[i-1][j]+1));            else                dp[i][j]=dp[i-1][j-1];    cout<<dp[len1][len2];    return 0;} 
5 0