1276:【例9.20】P2758 编辑距离
题目传送门[(https://www.luogu.com.cn/problem/P2758)]
题目描述
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符;
!皆为小写字母!
输入格式
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
输出格式
只有一个正整数,为最少字符操作次数。
输入输出样例
输入 #1
sfdqxbw
gfdgw
输出 #1
4
解
注意到删除A[i] 等价于 在B[i]前 插入
在A[i]前插入与B[i]相同的元素 等价于 删除 B[i]
修改A[i] 等价于 修改B[i]
为啥?
因为这样的两种操作,都增加了一次操作次数,最终带来了同样的结果
所以,我们只需要对一个串操作,最终的结果没有影响
只对B操作
f[i][j]表示要使A的前i个元素与B的前j个元素相同的最少操作次数
初始化
f[i][0] = i;
f[0][j] = j;
转移
如果A[i]等于B[i],不做修改,f[i][j] = f[i - 1][j - 1]
否则,三种修改方式,在B中加一个,f[i][j] = f[i - 1][j] + 1;
在B中删一个,f[i][j] = f[i][j - 1] + 1;
在B中改一个,f[i][j] = f[i - 1][j - 1] + 1;
三者取max
代码
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 2010
#define INF 1061109000
using namespace std;
int f[N][N], n1, n2;
string a , b;
int main()
{
cin >> a >> b;
for (int i = 0 ; i <= a.size() ; i++)
{
for (int j = 0 ; j <= b.size() ; j++)
f[i][j] = INF;
}
f[0][0] = 0;
f[0][1] = 1;
f[1][0] = 1;
for (int i = 0 ; i <= a.size() ; i++) f[i][0] = i;//重要的初始化
for (int j = 0 ; j <= b.size() ; j++) f[0][j] = j;//重要的初始化
//只编辑b[]
for (int i = 1 ; i <= a.size() ; i++)
{
for (int j = 1 ; j <= b.size() ; j++)
{
if(a[i - 1] == b[j - 1])
{
f[i][j] = f[i - 1][j - 1];
// cout << i << " " << j << " " << f[i][j] << endl;
continue;
}
f[i][j] = min(f[i][j], f[i - 1][j - 1] +1);
f[i][j] = min(f[i][j], f[i][j - 1] + 1);
f[i][j] = min(f[i][j], f[i - 1][j] + 1);
// cout << i << " " << j << " " << f[i][j] << endl;
}
}
/* for (int j = 1 ; j <= a.size() ; j++)
{
for (int i = 1 ; i <= b.size() ; i++) cout << f[j][i] << " ";
cout << endl;
}
*/
cout << f[a.size()][b.size()] << endl;
return 0;
}
1276:【例9.20】P2758 编辑距离的更多相关文章
- 洛谷——P2758 编辑距离
P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一 ...
- 洛谷 P2758 编辑距离
P2758 编辑距离 题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一 ...
- P2758 编辑距离
题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...
- 洛谷P2758编辑距离(线性DP)
题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...
- PAT 1007. 素数对猜想 (20)
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数."素数对猜想"认为"存在无穷多对相邻且 ...
- PAT乙级 1007. 素数对猜想 (20)
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
- PAT-乙级-1007. 素数对猜想 (20)
1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...
- (编辑距离问题 线性DP) nyoj1431-DNA基因鉴定
题目描述: 我们经常会听说DNA亲子鉴定是怎么回事呢?人类的DNA由4个基本字母{A,C,G,T}构成,包含了多达30亿个字符.如果两个人的DNA序列相差0.1%,仍然意味着有300万个位置不同,所以 ...
- [C++]PAT乙级1007.素数对猜想 (20/20)
/* 1007. 素数对猜想 (20) 让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷 ...
随机推荐
- deepin idea2019注册码
找了好久终于找到能用的注册码了https://blog.csdn.net/zixiao217/article/details/82942476第一个好像是已经过期了,然后试了下第二个发现可以直接官网下 ...
- 百度地图开发API
JavaScript API http://lbsyun.baidu.com/index.php?title=jspopular
- vue兄弟组件传值——事件总线
1.创建一个js文件,例如msg.js,放到合适位置,例如components中,或者其他位置也行.然后在兄弟两个组件中分别引入msg.js文件 msg.js: import Vue from 'vu ...
- python条件(三元)运算符
条件运算符 是 三元运算符 语法: 语句1 if 条件表达式 else 语句2 执行流程: 条件运算符在执行时,会先对条件表达式进行求值判断 如果判断结果为True,则执行 ...
- .net core 第三方工具包集合
日志 Nlog 单点登录
- 美食家App开发日记3
由于个人原因,感觉Android的学习特别复杂,初次接触,实在难以完成最初设想,所以将最初的设想做减法. 今天学习了ListView控件,将图片和美食名字使用ListView界面显示出来,并学习提升L ...
- 【java基础】妙记进制转换
一.二进制与十进制 1.正整数十进制转二进制 口诀:除二取余,倒序排列 解释:将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取将除得的余数,即换算为二进制数的结果 例如把5 ...
- intellij idea svn 切换分支
原文地址:https://blog.csdn.net/wangjun5159/article/details/75137964 切换分支 更新/切换svn的快捷键是ctrl+T,这个快捷键还是很好用的 ...
- GP工作室—系统设计
团队作业第二次作业--系统设计 问题 答案 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 团队名称 GP工作室 这个作业的目标 对项目软件进行更为详细的系统性设计 按照本游戏的设计要求 ...
- Python3基础之数据类型(字典)
Python3数据类型之 字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({} ...