博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CJOJ1644】【洛谷2758】编辑距离
阅读量:5101 次
发布时间:2019-06-13

本文共 1165 字,大约阅读时间需要 3 分钟。

题面

题目描述

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

1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符;
皆为小写字母

输入格式:

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

输出格式:

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

Input

sfdqxbw

gfdgw

Output

4

题解

一道DP裸体

先设一下状态
设f[i][j]表示串S1前i个字符到串S2前j个字符的编辑距离

看一看每一个f[i][j]可以怎么得到:

如果当前有S1[i]=S2[j]那么f[i][j]=f[i-1][j-1],直接由前面的状态就可以得到
否则:

  1. 可以由i-1和j-1的匹配情况加上一次修改操作
  2. 可以由i-1和j 的匹配情况加上一次删除操作
  3. 可以由i 和j-1的匹配情况加上一次添加操作

所以状态转移方程就可以得出来了

后面就不用写了,直接看代码吧

#include
#include
#include
#include
#include
#include
using namespace std;string s1,s2;//初始字符串 int l1,l2;int f[5000][5000];int main(){ cin>>s1>>s2; l1=s1.length(); l2=s2.length(); memset(f,127,sizeof(f)); //f[i][j]表示把 s1前i位变为 s2的前j位的 最短编辑距离 for(int i=0;i<=l2;++i) f[0][i]=i; for(int i=0;i<=l1;++i) f[i][0]=i; for(int i=1;i<=l1;++i) { for(int j=1;j<=l2;++j) { if(s1[i-1]==s2[j-1]) f[i][j]=min(f[i][j],f[i-1][j-1]);//如果两位相同 else 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<
<

转载于:https://www.cnblogs.com/cjyyb/p/7197172.html

你可能感兴趣的文章
JS 中的跨域请求
查看>>
JAVA开发环境搭建
查看>>
mysql基础语句
查看>>
Oracle中的rownum不能使用大于>的问题
查看>>
[Data Structure & Algorithm] 有向无环图的拓扑排序及关键路径
查看>>
cassandra vs mongo (1)存储引擎
查看>>
Visual Studio基于CMake配置opencv1.0.0、opencv2.2
查看>>
Vue音乐项目笔记(三)
查看>>
遍历Map对象
查看>>
计算剪贴板里仿制的代码行数
查看>>
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
[最小割][Kruskal] Luogu P5039 最小生成树
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>