zoukankan      html  css  js  c++  java
  • POJ3356 AGTC 题解 最短编辑距离问题

    题目大意:

    求:由字符串 s 通过下列三种操作

    1. 插入一个字符;
    2. 删除一个字符;
    3. 改变一个字符

    变换到字符串 t 所需要的最少操作次数(亦即最短编辑距离问题)

    解题思路:

    定义状态 (f[i][j]) 表示 (s[0..i])(t[0..j]) 合并所需的最小花费,则可得状态转移方程为(字符串坐标从 (1) 开始,(0) 表示一个都没选):

    • (i=0) 时, (f[i][j] = j)
    • 否则,当 (j=0) 时, (f[i][j] = i)
    • 否则,当 (s[i] = t[j]) 时, (f[i][j] = f[i-1][j-1])
    • 否则((i,j gt 0)(s[i] e t[j])),(f[i][j] = min ( f[i-1][j-1], f[i-1][j], f[i][j-1] ) + 1)

    实现代码如下:

    #include <cstdio>
    #include <iostream>
    using namespace std;
    const int maxn = 1010;
    int n, m, f[maxn][maxn];
    char s[maxn], t[maxn];
    int main() {
        while (~scanf("%d%s%d%s", &n, s+1, &m, t+1)) {
            for (int i = 0; i <= n; i ++) {
                for (int j = 0; j <= m; j ++) {
                    if (!i) f[i][j] = j;
                    else if (!j) f[i][j] = i;
                    else if (s[i] == t[j]) f[i][j] = f[i-1][j-1];
                    else f[i][j] = min(f[i-1][j-1], min(f[i-1][j], f[i][j-1])) + 1;
                }
            }
            printf("%d
    ", f[n][m]);
        }
        return 0;
    }
    
  • 相关阅读:
    c#剪切板操作
    eclipse mvn build error tips
    Redis Tips
    IntilliJ Idea 使用中的问题与解决方案
    mongo
    python
    SQL Relative
    sybase update
    run current vim file
    git
  • 原文地址:https://www.cnblogs.com/quanjun/p/12255841.html
Copyright © 2011-2022 走看看