zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    !function() {}()
    element.dataset API
    正则匹配 数字和英文状态下的逗号
    《vim实用技巧》读书笔记
    ajax分页
    smarty分页类
    数组排序
    数组大类
    自动刷新价格
    简单购物车
  • 原文地址:https://www.cnblogs.com/onlyli/p/7240393.html
Copyright © 2011-2022 走看看