可以举一反三的动态规划问题(最短编辑问题)

news2024/11/23 12:04:02

给定两个字符串 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字符转换成b字符有三种方式

1.删除 aa-->a 删一个

2.替换 aa-->ab a替换成b

3.插入 a-->ab  插入b

理清题目意思,其实难在定义状态表示f(i,j),如下图

 对应上面状态表示

1.删除 aa-->a 删一个             f(i,j)=f(i-1,j)+1  

2.替换 aa-->ab a替换成b        f(i,j)=f(i-1,j-1)+1/0           加一或者加0  判断a[i]==b[j]

3.插入 a-->ab  插入b                f(i,j)=f(i,j-1)+1

完整代码(不带注释):

#include <iostream>
#include <algorithm>
using namespace std;
const int N=1010;
char a[N],b[N];
int dp[N][N];
int main(){
    int n,m;
    cin>>n>>a+1>>m>>b+1;
    for(int i=0;i<=m;i++)dp[0][i]=i;
    for(int i=0;i<=n;i++)dp[i][0]=i;
    for (int i = 1; i <=n; ++i)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1);
            if(a[i]==b[j])dp[i][j]= min(dp[i][j],dp[i-1][j-1]);
            else dp[i][j]= min(dp[i][j],dp[i-1][j-1]+1);
        }
    }
    cout<<dp[n][m]<<endl;
}

完整代码(带注释):

 

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
char a[N], b[N];
int dp[N][N];

int main() {
    int n, m;
    
    // 输入字符串A的长度
    cin >> n;
    
    // 输入字符串A
    cin >> a + 1;
    
    // 输入字符串B的长度
    cin >> m;
    
    // 输入字符串B
    cin >> b + 1;

    // 初始化边界条件,dp[i][0]表示将A的前i个字符变为空字符串的最小操作次数
    for (int i = 0; i <= m; i++)
        dp[0][i] = i;
    
    // 同理,dp[0][j]表示将空字符串变为B的前j个字符的最小操作次数
    for (int i = 0; i <= n; i++)
        dp[i][0] = i;

    // 动态规划,填充dp数组
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; j++) {
            // dp[i-1][j]+1表示删除操作
            // dp[i][j-1]+1表示插入操作
            dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);

            // 如果A的第i个字符与B的第j个字符相同,则dp[i][j]可能等于dp[i-1][j-1]
            if (a[i] == b[j])
                dp[i][j] = min(dp[i][j], dp[i - 1][j - 1]);
            else
                // 否则,dp[i][j]可能等于dp[i-1][j-1]+1,表示替换操作
                dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1);
        }
    }
    
    // 输出最终结果,即将A变为B的最小操作次数
    cout << dp[n][m] << endl;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1422261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

掌握 Android JNI 基础

写在前面 最近在看一些底层源码&#xff0c;发现 JNI 这块还是有必要系统的看一下&#xff0c;索性就写一写博客&#xff0c;加深加深印象&#x1f37b; 本文重点聊一聊一些干货&#xff0c;避免长篇大论 JNI 概述 JNI 是什么&#xff1f; 定义&#xff1a;Java Native In…

类和对象 第六部分 继承 第一部分:继承的语法

一.继承的概念 继承是面向对象的三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图&#xff1a; 我们可以发现&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性&#xff0c;这个时候&#xff0c;我们可以讨论利用继承的技术&#xff0c;…

使用antdesign3.0、echarts制作固定资产后台管理系统原型

学了半个月Axure,周末用半天时间&#xff0c;照着网上的模板做了一个固定资产后台管理系统的原型。重点是内联框架的使用&#xff0c;和对echarts表格js代码的调试。原型链接&#xff1a;https://qoz5rv.axshare.com 资产管理系统

qt 动态添加多个button按钮,并添加单击响应

qt动态添加多个button按钮简单&#xff0c;难题是如何对动态的按钮添加响应函数&#xff0c;本文解决方案有两个 方法一&#xff1a;使用信号-槽函数 QString strTemp;int nCol 6;//一行有6个for(int i 0; i < CZList.size(); i){int ii i / nCol;int jj i % nCol;strT…

Qt+css绘制标题

之前学过html和小程序&#xff0c;帮老师做项目的时候也用过vue&#xff0c;在想qt绘制界面是不是也可以使用css,然后查了一些资料&#xff0c;绘制了一个标题&#xff0c;准备用到智能家居的上位机上面。 成果 源码 重写了paintEvent函数和TimeEvent函数&#xff0c;一个用于绘…

Next.js如何正确处理跨域问题?

以前一直使用Vue来写前端。去年下半年接手了一个基于React Next.js的项目&#xff0c;于是顺带学习了一下Next.js。由于Next.js的特点&#xff0c;这个项目的前后端是放在一起的。一开始没什么问题&#xff0c;看了半天文档就上手了。 上周我们需要在另一个网页项目中&#x…

基于DataX完成数据导入-仅新增方案

仅新增方式: 订单退款表为例, 探讨如何完成仅新增方式导入操作 从业务库将数据导入到ODS层, 分为 首次导入和增量导入两部分, 其中首次导入指的第一次建表, 导入数据, 此时一般都是全量导入, 后续每一天都是采用增量导入的方式, 当前项目, 增量模式: T1(当天处理都是上一天的数…

Vue中嵌入原生HTML页面

Vue中嵌入html页面并相互通信 需求&#xff1a;b2b支付需要从后获取到数据放到form表单提交跳转&#xff0c;如下&#xff1a; 但是vue目前暂时没找到有类似功能相关文档&#xff0c;所以我采用iframe嵌套的方式 1. Vue中嵌入Html <iframe src"/static/gateway.htm…

储能柜控制单元|EsccUnit8300储能柜控制单元功能简介及定制开发|储能EMS能量控制单元|储能控制单元|储能柜EMS系统|储能协调控制器

储能柜控制单元&#xff5c;EsccUnit8300储能柜控制单元功能简介及定制开发|储能EMS能量控制单元|储能控制单元|储能柜EMS系统|储能协调控制器 一&#xff1a;什么叫储能柜 Energy storage cabinet 储能柜包含柜体、由池组单元、由池管理单元、储能变流器、控制单元、消防单元…

【算法与数据结构】121、122、123、188、309、714、LeetCode买卖股票的最佳时机I II III IV+含冷冻期+含手续费

文章目录 一、121、LeetCode买卖股票的最佳时机1.1 动态规划1.2 动态规划-滚动数组 二、122、买卖股票的最佳时机 II三、123、买卖股票的最佳时机 III七、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、121、LeetCode买…

【科技素养题】少儿编程 蓝桥杯青少组科技素养题真题及解析第23套

少儿编程 蓝桥杯青少组科技素养题真题及解析第23套 1、英国计算机科学家艾伦图灵于 1950 年提出了著名的“图灵测试”,用于判断计算机是否具有智能。“图灵测试”是通过()的方法进行判断的 A、让两台计算机对话 B、让人类与计算机对话 C、给计算机出题 D、让计算机分辨图…

Logstash 7.7.1版本安装系统梳理

前言 上一篇文章介绍了 《ElasticSearch7.7.1集群搭建 & Kibana安装》&#xff0c;今天说一下 Logstash的安卓和配置&#xff1b; Logstash是一个开源的数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化…

【数据结构】双向带头循环链表实现及总结

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 双向带头循环链表的实现2. 顺序表和链表的区别 1. 双向带头循环链表的实现 List.h #pragma once #include <stdio.h> #include <assert.h> #include <stdlib.h> #include <stdbool.h>typede…

Springboot-SpringCloud学习

文章目录 web项目开发历史 SpringBootSpring以及Springboot是什么微服务第一个Springboot项目配置如何编写 yaml自动装配原理集成 web开发&#xff08;业务核心&#xff09;集成 数据库 Druid分布式开发&#xff1a;Dubbo&#xff08;RPC&#xff09; zookeeperswagger&#x…

免费的ppt网站分享

前言 相信大学生们深有体会&#xff0c;对于学校而言&#xff0c;好像是任何活动都需要我们做ppt&#xff0c;当你拿着自己辛苦做的ppt去展示现场的时候&#xff0c;你看到别人的ppt比你的还好&#xff0c;此时心情就是毙&#xff0c;当你知道人家不过是仅仅的1个小时不到就完成…

Springboot集成Javamelody

JavaMelody的目标是监视QA和生产环境中的Java或Java EE应用服务器。它不是模拟用户请求的工具&#xff0c;而是根据用户对应用程序的使用情况来衡量和计算应用程序实际操作的统计信息的工具。JavaMelody主要基于请求统计和演化图。 它允许改进QA和生产中的应用程序&#xff0c…

海外云手机对于亚马逊卖家的作用

近年来&#xff0c;海外云手机作为一种新型模式迅速崭露头角&#xff0c;成为专业的出海SaaS平台软件。海外云手机在云端运行和存储数据&#xff0c;通过网页端操作&#xff0c;将手机芯片放置在机房&#xff0c;通过网络连接到服务器&#xff0c;为用户提供便捷的上网功能。因…

WebService的services.xml问题

WebService有多种实现方式&#xff0c;这里使用的是axis2 问题&#xff1a; 在本地开发&#xff0c;访问本地的http://localhost:8080/services/ims?wsdl&#xff0c;正常访问 但是打成jar包&#xff0c;不管是linux还是window启动&#xff0c;都访问不到&#xff0c;报错…

双创竞赛项目申报:Java + Spring Boot的实战指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

2024前端面试总结—JS篇(文档持续更新中。。。)

1、Event Loop&#xff08;事件循环&#xff09;机制 JS是单线程的非阻塞语言 为什么是单线程&#xff08;如果js是多线程&#xff0c;那么两个线程同时对同一个Dom进行操作&#xff0c;一个增一个删&#xff0c;浏览器该如何执行&#xff1f;&#xff09; 非阻塞&#xff08;…