题目传送门[(https://www.luogu.com.cn/problem/P2758)]

题目描述

设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:

1、删除一个字符;

2、插入一个字符;

3、将一个字符改为另一个字符;

!皆为小写字母!

输入格式

第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。

输出格式

只有一个正整数,为最少字符操作次数。

输入输出样例

输入 #1

sfdqxbw

gfdgw

输出 #1

4

  1. 注意到删除A[i] 等价于 B[i]前 插入
  2. A[i]前插入与B[i]相同的元素 等价于 删除 B[i]
  3. 修改A[i] 等价于 修改B[i]
  4. 为啥?
  5. 因为这样的两种操作,都增加了一次操作次数,最终带来了同样的结果
  6. 所以,我们只需要对一个串操作,最终的结果没有影响
  7. 只对B操作

f[i][j]表示要使A的前i个元素与B的前j个元素相同的最少操作次数

初始化

f[i][0] = i;

f[0][j] = j;

转移

  1. 如果A[i]等于B[i],不做修改,f[i][j] = f[i - 1][j - 1]
  2. 否则,三种修改方式,在B中加一个,f[i][j] = f[i - 1][j] + 1;
  3. B中删一个,f[i][j] = f[i][j - 1] + 1;
  4. B中改一个,f[i][j] = f[i - 1][j - 1] + 1;
  5. 三者取max

代码

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <string>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. #define N 2010
  8. #define INF 1061109000
  9. using namespace std;
  10. int f[N][N], n1, n2;
  11. string a , b;
  12. int main()
  13. {
  14. cin >> a >> b;
  15. for (int i = 0 ; i <= a.size() ; i++)
  16. {
  17. for (int j = 0 ; j <= b.size() ; j++)
  18. f[i][j] = INF;
  19. }
  20. f[0][0] = 0;
  21. f[0][1] = 1;
  22. f[1][0] = 1;
  23. for (int i = 0 ; i <= a.size() ; i++) f[i][0] = i;//重要的初始化
  24. for (int j = 0 ; j <= b.size() ; j++) f[0][j] = j;//重要的初始化
  25. //只编辑b[]
  26. for (int i = 1 ; i <= a.size() ; i++)
  27. {
  28. for (int j = 1 ; j <= b.size() ; j++)
  29. {
  30. if(a[i - 1] == b[j - 1])
  31. {
  32. f[i][j] = f[i - 1][j - 1];
  33. // cout << i << " " << j << " " << f[i][j] << endl;
  34. continue;
  35. }
  36. f[i][j] = min(f[i][j], f[i - 1][j - 1] +1);
  37. f[i][j] = min(f[i][j], f[i][j - 1] + 1);
  38. f[i][j] = min(f[i][j], f[i - 1][j] + 1);
  39. // cout << i << " " << j << " " << f[i][j] << endl;
  40. }
  41. }
  42. /* for (int j = 1 ; j <= a.size() ; j++)
  43. {
  44. for (int i = 1 ; i <= b.size() ; i++) cout << f[j][i] << " ";
  45. cout << endl;
  46. }
  47. */
  48. cout << f[a.size()][b.size()] << endl;
  49. return 0;
  50. }

1276:【例9.20】P2758 编辑距离的更多相关文章

  1. 洛谷——P2758 编辑距离

    P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一 ...

  2. 洛谷 P2758 编辑距离

    P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一 ...

  3. P2758 编辑距离

    题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...

  4. 洛谷P2758编辑距离(线性DP)

    题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...

  5. PAT 1007. 素数对猜想 (20)

    让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在无穷多对相邻且 ...

  6. PAT乙级 1007. 素数对猜想 (20)

    1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...

  7. PAT-乙级-1007. 素数对猜想 (20)

    1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...

  8. (编辑距离问题 线性DP) nyoj1431-DNA基因鉴定

    题目描述: 我们经常会听说DNA亲子鉴定是怎么回事呢?人类的DNA由4个基本字母{A,C,G,T}构成,包含了多达30亿个字符.如果两个人的DNA序列相差0.1%,仍然意味着有300万个位置不同,所以 ...

  9. [C++]PAT乙级1007.素数对猜想 (20/20)

    /* 1007. 素数对猜想 (20) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷 ...

随机推荐

  1. hexo搭建博客系列(三)美化主题

    文章目录 其他搭建 1. 添加博客图标 2. 鼠标点击特效(二选一) 2.1 红心特效 2.2 爆炸烟花 3. 设置头像 4. 侧边栏社交小图标设置 5. 文章末尾的标签图标修改 6. 访问量统计 7 ...

  2. ArcGIS Server 动态图层发布调用图解

    目录 1 前言 1.1 简介 1.2 适用场景 2 动态图层 2.1 共享地图服务 2.2 动态工作空间添加 2.2.1 企业级数据库 2.2.2 shapefile文件夹 2.2.3 栅格文件夹 2 ...

  3. DWVA-关于反射型xss的漏洞详解<xss reflected>

    反射型xss low级别 代码如下: <?php header ("X-XSS-Protection: 0"); // Is there any input? if( arr ...

  4. Android 平台JS调试技术

    1.  测试技术简介 Android平台微信公众号一般以H5的形式开发,测试发现流量一般都通过js进行加密传输,导致无法对越权.SQL注入等风险点进行测试.针对此难点,本手册会介绍包括Android环 ...

  5. UIChatBox模块示例demo

    感谢论坛版主 马浩川 的分享. UIChatBox 模块是一个聊天输入框模块,开发者可自定义该输入框的功能.通过 open 接口可在当前 window 底部打开一个输入框,该输入框的生命属于当前 wi ...

  6. 安装Mysql 8.0的艰难体验

    背景: Mysql 8.0 以后版本,在性能等方面有了很大提升,而且在自动编号.Timestamp等字段的设置上有了很方便的进步,因此在一年前即开始将原有的基于5.5版本的服务器逐渐向8.0转移.但转 ...

  7. 数据可视化之Matplotlib的使用

    1.什么是数据可视化 数据可视化在量化分析当中是一个非常关键的辅助工具,往往我们需要通过可视化技术,对我们的数据进行更清晰的展示,这样也能帮助我们理解交易.理解数据.通过数据的可视化也可以更快速的发现 ...

  8. AD19覆铜与边框间距设置方法

    转载请注明出处,并附带本文网址https://www.cnblogs.com/brianblog/p/9894867.html, 由于高版本AD不能将机械层直接转变为KEPP OUT LAYER层,所 ...

  9. IO系统-基本知识

    注:本文档主要整理了Linux下IO系统的基本知识,是整理的网易云课堂的学习笔记,老师讲得很不错,链接如下:Linux IO系统 1.Linux操作系统的基本构成 内核:操作系统的核心,负责管理系统的 ...

  10. qt中的拖拽及其使用技巧

    关于qt中的拖放操作,首先可以看这篇官方文档:http://doc.qt.io/qt-5.5/dnd.html 一.QDrag 首先是创建QDrag,可以在mousePressEvent或者mouse ...