首页 > 其他分享 >AcWing 902. 最短编辑距离

AcWing 902. 最短编辑距离

时间:2023-10-23 22:01:10浏览次数:101  
标签:902 字符 包含 -- 最短 int 字符串 操作 AcWing

JWvFczgRNg.jpg

题目

给定两个字符串 $A$ 和 $B$,现在要将 $A$ 经过若干操作变为 $B$,可进行的操作有:

  1. 删除–将字符串 $A$ 中的某个字符删除。
  2. 插入–在字符串 $A$ 的某个位置插入某个字符。
  3. 替换–将字符串 $A$ 中的某个字符替换为另一个字符。 现在请你求出,将 $A$ 变为 $B$ 至少需要进行多少次操作。

输入格式 第一行包含整数 $n$,表示字符串 $A$ 的长度。

第二行包含一个长度为 $n$ 的字符串 $A$。

第三行包含整数 $m$,表示字符串 $B$ 的长度。

第四行包含一个长度为 $m$ 的字符串 $B$。

字符串中均只包含大小写字母。

输出格式 输出一个整数,表示最少操作次数。

数据范围 $1≤n,m≤1000$ 输入样例:

10 
AGTCTGACGC
11 
AGTAAGTAGGC

输出样例:

4

思路

由动态规则常用思路:
状态表示 -- 集合:将A[1-i]变成B[1-j]的操作次数的集合。
        -- 属性:数量
状态计算 -- 对A操作与对B操作等价,可以只看A或只看B,这里看A

当遍历到 $i、j$ 时,存在以下情况:

  1. $A$ 删除第 $i$ 个字符--说明 $A[i - 1] == B[j], f[i, j] = f[i - 1][j] + 1$
  2. $A$ 增加一个字符--前提为 $A[i] == B[j - 1], f[i, j] = f[i][j - 1] + 1$
  3. 替换:当 $A[i] == B[j]$,则没有替换的必要 $f[i, j] = f[i - 1][j - 1]$;否则 $A[i - 1] == B[j - 1], f[i, j] = f[i - 1][j - 1] + 1$

代码

#include <iostream>

using namespace std;

const int N = 1010;

int n, m;
char a[N], b[N];
int f[N][N];

int main()
{
    cin >> n >> a + 1 >> m >> b + 1;
    
    // 初始化边界的值
    for (int i = 0; i <= n; i ++ ) f[i][0] = i;
    for (int i = 0; i <= m; i ++ ) f[0][i] = i;
    
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
        {
            f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1;
            
            if (a[i] == b[j]) 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);
        }
        
    cout << f[n][m] << endl;
    
    return 0;
}

标签:902,字符,包含,--,最短,int,字符串,操作,AcWing
From: https://blog.51cto.com/u_16170343/7994622

相关文章

  • 洛谷 最长最短单词 c语言 函数解决
    #include<stdio.h>#include<string.h>inti;intmain(){intIs_letters(chara);//声明判断字母intbigword(charstr[]);//声明最长单词intminword(charstr[]);//声明最短单词charstr[20010];//str要足够大intt;gets(str);t......
  • [Leetcode] 0821. 字符的最短距离
    821.字符的最短距离题目描述给你一个字符串s和一个字符c,且c是s中出现过的字符。返回一个整数数组answer,其中answer.length==s.length且answer[i]是s中从下标i到离它最近的字符c的距离。两个下标 i和j之间的距离为abs(i-j),其中abs是绝......
  • 对acwing355异象石引理的证明
    首先我们抽象一下这道题的模型,然后把引理记住模型:对于一棵树上选定的一些点,把他们连通起来的最小边数我们先考虑一种朴素做法,对于任何一种方案,任取其中两个点,那么这个方案一定包含这两个点之间的路径就是说,我们依次添加每个点,对于每一个新添加进来的点,让这个点与其已经添加的点......
  • 深度优先搜索的最短路径问题
    这个简单的图,要求使用深度优先算法求出(1,1)到终点的最短路径。1、分析就目前看来,(1,1)->(1,2)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,3)和(1,1)->(2,1)->(3,1)->(4,1)->(5,1)->(5,2)->(5,3)->(4,3)这两条路径是相同的长度的最短路劲。但是,这是我们的肉眼看到的,如果是计算机计......
  • Codeforces Round 902 (Div. 2, based on COMPFEST 15 - Final Round)
    \(D.EffectsofAntiPimples\)对每个数字能到达的所有位置先预处理最大值,那么就代表选择这个数字之后真实的贡献,那么对这样的预处理值,最小值显然只有一种做法,为\(2^0\),第二小的值应该可以与最小值一起选择,所以答案为\(2^1\),以此类推之后,每个值乘上对应的2的幂次之后求和即......
  • Acwing 最长上升子序列
    题目给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000−10^9≤数列中的数≤10^9输入样例:73121856输出样例:4题解......
  • QCN9024 Performance|WiFi6E TriBand Card DR9074 Achieving 1.3Gbps Speed in 5.28GH
    QCN9024Performance|WiFi6ETri-BandCardDR9074AchievesBlazing1.3GbpsSpeedin5.28GHz80MHzBWThroughputTestBoththeQCN9074andQCN9024areQualcommchips,andWallyschosethisplatformforthedevelopmentoftheTri-Bandcardduetoitsexcept......
  • 多源最短路径的原理及C++实现
    时间复杂度O(n3),n是端点数。核心代码template<classT,TINF=1000*1000*1000>classCNeiBoMat{public:CNeiBoMat(intn,constvector<vector<int>>&edges,boolbDirect=false,boolb1Base=false){m_vMat.assign(n,vector<int>......
  • 存在负权边的单源最短路径的原理和C++实现
    负权图此图用朴素迪氏或堆优化迪氏都会出错,floyd可以处理。负环图 但floyd无法处理负权环,最短距离是无穷小。在环上不断循环。经过k条边的最短距离(可能有负权变)贝尔曼福特算法(bellman_ford)就是解决此问题的。原理循环k次,循环第i次时,m_vDis表示各点最多经过i-1条边的最短距离;v......
  • 堆优化迪氏最短单源路径原理及C++实现
    时间复杂度O(ElogE),E是边数。适用与稀疏图。使用前提边的权为正。可以非连通,非连通的距离为-1。原理优选队列(小根堆)记录两个数据:当前点到源点距离,当前点。先处理距离小的点;如果距离相等,先处理谁都可以。可以用pair记录,不用重写小于。优先队列只记录如下情况的距离:一,{0,源点}。二,......