51nod--1183 编辑距离(动态规划)

题目:

1183 编辑距离
基准时间限制: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

分析:

首先, 对于一个状态 
Dp[i][j] = min(Dp[i-1][j], min(Dp[i][j-1], Dp[i-1][j-1])) + 1;
对于当前状态, 往任何一个串后添加一个字符, 所需要的操作数 + 1的。(先不讨论相等, 不相等。)
如果 a[i] == b[j] , Dp[i][j] = min(Dp[i][j], Dp[i-1][j-1]);
两个字符相等是不需要添加任何操作的。

实现:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1000 + 131;

int Dp[maxn][maxn];

int Solve(const string& a, const string& b) {
    int n = a.length();
    int m = b.length();
    for(int i = 0; i < n; ++i) Dp[i][0] = i;
    for(int i = 0; i < m; ++i) Dp[0][i] = i;
    ///
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j) {
            Dp[i][j] = min(Dp[i-1][j], min(Dp[i][j-1], Dp[i-1][j-1])) + 1;
            if(a[i-1] == b[j-1])
                Dp[i][j] = min(Dp[i][j], Dp[i-1][j-1]);
        }
    return Dp[n][m];
}

int main() {
    string s, t;
    while(cin >> s >> t) {
        cout << Solve(s, t) << endl;
    }
}
原文地址:https://www.cnblogs.com/aoxuets/p/5506839.html