《动态规划》之--字符串比较问题(扩展距离)

数据结构学习第14篇 - 动态规划 动态规划算法 一、字符串的扩展距离 对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩... 阅读详情

问题:

对于长度相同的2个字符串A和B,其距离定义为相应位置字符距离之和。2个非空格字符的距离是它们的ASCII码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一个定值k。在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干空格字符所产生的字符串。在字符串A和B的所有长度相同的扩展中,有一对距离最短的扩展,该距离称为字符串A和B的扩展距离。对于给定的字符串A和B,设计一个算法,计算其扩展距离。

测试数据:

输入:cmc      snmn        2       (分别表示字符串A、B和定值k)

输出:10

 

解答:

设字符串A和B的字串A[1...i]和B[1...j]的扩展距离是val(i, j);

依题意,字符串A和B有三种可能的情况:

1)A串最后一个字符是空格,B串最后一个字符是字母,则val(i, j) = val(i-1, j) + k;

2)A串最后一个字符时字母,B串最后一个字符时空格,则val(i, j) = val(i, j-1) + k;

3)A串和B串最后一个字符均是字母,则val(i, j) = val(i-1, j-1) + dist(ai , bi);

由上可知,val(i, j)具有最优子结构性质,且满足如下递推式:

val(i, j) = min{ val(i-1, j) + k,val(i, j) + k,val(i-1, j-1) + dist(ai , bi) }

(使用动态规划算法,自底向上的计算各个子问题并利用每次计算的结果,避免重复运算,从而降低算法复杂度。)

从动态规划递归式可知,算法的时间复杂度为O(mn),m和n分别是字符串A和B的长度。

 

代码如下:

#include <iostream>

#include <cmath>

 

#define MAX 100000    //标识最大的可能整数

 

int val[300][300];

 

std::string stra;        //字符串A

std::string strb;       //字符串B

int k;        //定值k

 

//返回字符a与b的ASCII码的差的绝对值

int dist(char a, char b)

{

         return abs(a-b);     

}

 

int comp()

{

         int len1, len2;

         int tmp;

         val[0][0] = 0;

         len1 =    stra.length();

         len2 = strb.length();

        

         for(int i=0; i<=len1; i++)   //字符串A和B的有效下标是º1~len,下标0表示空字符串

         {                                                                //i或j是0表示A或B串为空串

                   for(int j=0; j<=len2; j++)

                   {

                            if(i+j)//i和j至少一个大于0

                            {

                                     val[i][j] = MAX;

                                    

                                     tmp = val[i-1][j] + k;

                                     if(i && (tmp<val[i][j]))//i大于0

                                               val[i][j] = tmp;

                                              

                                     tmp = val[i][j-1]+k;

                                     if(j && (tmp<val[i][j]))//j大于0

                                               val[i][j] = tmp;

                                              

                                     tmp = val[i-1][j-1] + dist(stra[i], strb[j]);

                                     if((i*j) && (tmp<val[i][j])) //i和j至少有一个不为0

                                               val[i][j] = tmp;                                          

                            }

                   }       

         }

         return val[len1][len2];

}

 

int main()

{

         std::cin>>stra>>strb>>k;

         stra = " " + stra;      //此处在字符串开头添加一个空格,是为了使字符串stra

         strb = " " + strb;    //的控制台输入的有效字符下标从1到stra.length()

         std::cout<<comp()<<std::endl;

         system("pause");

         return 0;

}

 

 

 

003-5算法笔记【动态规划】习题3-17-字符串扩展距离 题目 对于长度相同的两个字符串A和B,其距离定义为相应位置字符距离之和.两个非空格字符的距离是它们的ASCII编码之差的绝对值;空格与空格的距离为0,空格与其他字符的距离为一定值k. 在一般情况下,字符串A和B的长度不一定相同.字符串A的扩展是在A中插入若干空格字符所产生的字符串.在字符串A和B的所有长度相同的扩展中,有一对距离最小的扩展,该距离称为字符串A和B的扩展距离. 对于给定的字符串A和B,试计算其扩展距离. 输入 第1行是字符串A,第2行是字符串B,第3行是空格与其他字符的距离定值k. cmc s 阅读详情

相关推荐

动态规划求字符串比较问题

《动态规划》之--字符串比较问题(扩展距离),主要思路通过策略和无效性来求解。特点最优子结构性质,重叠子问题。

C++字符串比较问题(动态规划)

利用动态规划的思想求解字符串比较问题

weixin_48842132的博客 1328

字符串比较问题对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格

字符串比较问题 Description ?问题描述: 对于长度相同的2 个字符串A和B,其距离定义为相应位置字符距离之和。2 个非空格 字符的距离是它们的ASCII码之差的绝对值。空格与空格的距离为0;空格与其它字符的距 离为一定值k。 在一般情况下,字符串A和B的长度不一定相同。字符串A的扩展是在A中插入若干 空格字符所产生的字符串。在字符串A 和B 的所有长度相同的扩展中,有一对距离最小的 扩展,该距离称为字符串A和B的扩展距离。 对于给定的字符串A和B,试设计一个算法,计算其扩展距离。 ?编程任务: 对于给定的字符串A和B,编程计算其扩展距离。 Input 由文件input.txt给出输入数据。第1 行是字符串A;第2 行是字符串B。第3行是空格 与其它字符的距离定值k。 Output 将计算出的字符串A和B的扩展距离输出到文件output.txt。 Sample Input cmc snmn 2 Sample Output 10

动态规划算法设计字符串比较问题_「Javascript算法设计」× 动态规划与回溯算法...

目录:分而治之算法动态规划回溯算法分而治之算法分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分搜索等)分而治之算法可以分成三个部分分解原问题为多个子问题(原问题的多个小实例)解决子问题,用返回解决子问题的方式的递归算法。递归算法的基本情形可以用来解决子问题组合这些子问题的解决方式,得到原问题的解我们利用...

weixin_31188807的博客 443

动态规划算法求解字符串比较问题c++源代码

对于给定的字符串A和B,给定其字串的内容和空格相对字符的距离,使用动态规划算法求解两字符串的扩展距离。

汽车零部件智能装配:C#+YOLOv8实现螺栓漏装检测与齿轮错位识别(附PLC通信与机械臂控制)

YOLOv8:小目标检测的最优解相比YOLOv7,YOLOv8的C2f特征融合网络对小目标(5-10mm螺栓)检测精度提升12%,且推理速度快8%;支持大输入尺寸(不显著增加耗时),可放大螺栓细节;官方提供yolov8n.pt(nano版),在边缘计算盒上能跑40+FPS,满足实时性。C#:工业软件的“兼容性核心”主流PLC(西门子S7-1200/1500)、机械臂(ABB、KUKA)的SDK多基于.NET开发,C#可直接调用,避免跨语言通信延迟;多线程管理成熟(Task。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1146

算法设计二(5)—— 字符串比较问题

代码链接:pan.baidu.com/s/1w-VSMWmr9ntEWWdxZoD4Yw 码:jnlh 算法分析与设计第 2 次实验 时间 2020.4.23 实验名称 字符串比较问题 实验目的 通过上机实验,要求掌握动态规划算法的问题描述、算法设计思想、程序设计。......

weixin_43973089的博客 1447

CMAC算法原理

2、K1 通过以下运算导出:若 L 的最高有效位等于 0,则 K1 是 L 的左移 1 位。3、K2 通过如下运算导出:若 K1 的最高有效位等于 0,则 K2 是 K1 的左移 1 位。采用了 AES 算法中的类似 CBC 模式的加密方式,即对前一个分组的密文与当前分组的明文进行异或操作后在加密,2、分块处理:首先将消息分成多个固定长度的块,若消息长度不是块大小的倍数,则可以使用填充来将其填充到合适的大小。1、子密钥计算,通过主密钥生成子密钥(key1,key2),子密钥用于最后一个块处理;

sky的博客 1658

0329_算法22级1班实验3(动态规划)

设dp[i][j]表示从位置(i, j) 出发到达底部的最优路径的总和。则有递推关系:。这个递推关系表示,从当前位置出发,可以选择向下走或者向右下走,选择两者中路径权值较大的方向,然后加上当前位置的权值。

重生之费费写代码 988

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 226

串口通信的性能瓶颈分析:如何提高数据吞吐量和降低延迟

摘要: 串口通信在高频或大数据场景下存在吞吐量不足、延迟高、丢帧等问题,主要瓶颈包括波特率限制、缓冲区不足、CPU轮询延迟等。优化策略包括:提升波特率至硬件上限、增大缓冲区、采用异步I/O(如ReadAsync)减少线程切换,使用二进制协议降低解析开销。实时性方面需启用硬件流控、批量发送数据,并优化线程优先级。跨平台适配需区分Windows/Linux的缓冲区设置与异步机制。性能测试可通过吞吐量、延迟及回环测试验证优化效果,核心原则是硬件匹配、异步处理、协议优化与跨平台适配。(150字)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 983

字符串的扩展距离问题--------动态规划算法

学无止境,笔勤不辍。最近笔者又闲了下来,于是抽空在课上写一篇关于动态规划思想的典型问题(最近遇到的奇奇怪怪的问题,困扰了笔者一段时间)。希望能给大家一些帮助和启示...

Super_Ye6的博客 792

深入解析逆时偏移(RTM)算法及其在C++中的实现

逆时偏移(Reverse Time Migration, RTM)是一种高级地震成像技术,广泛应用于地震勘探中。RTM通过逆时传播波场来构建地震子波,能够提供更高分辨率和更精确的地下构造图像。本文将详细介绍RTM的基本原理,并通过C++代码示例,深入解析如何实现和优化RTM算法。希望这篇文章能够为地球物理学家和C++开发者提供有价值的参考。

qq_38334677的博客 1528

HNU_算法_实验3(2021级)-算法实验1-字符串比较问题

实现题3-17 字符串比较问题:

蟑螂恶霸的博客 1281

面向边缘计算的YOLOv12模型剪枝-蒸馏联合优化实战教程**

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

FJN110的博客 158

LIS2DH三轴加速度传感器原理图设计,已量产(加速度传感器)

最近在做一款可穿戴设备原型时,选了 LIS2DH 这款加速度计 —— 比起之前常用的 ADXL345,它在低功耗和稳定性上的优化刚好戳中了可穿戴设备 “续航 + 可靠” 的核心需求。下面结合这次画的原理图,聊聊这个小模块的硬件设计细节。

不脱发的程序猿 389

2016 东莞特长生 T3 :字串距离 【洛谷P1279】

2016  东莞特长生  T3:字串距离2016 ~~东莞特长生~~T3 :字串距离2016  东莞特长生  T3:字串距离 【问题描述】 设有字符串 X,我们称在 X 的头尾及中间插入任意多个空格后构成的新字符串为 X 的扩展串,如字符串 X 为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是 X 的扩展串,这里“□”代表空格字符。如果 A1 是字符串 A 的扩展串,B1 是字符串

天空之心 146

泰凌微8258入门教程——导读

基于泰凌微TLSR8258 Bluetooth® SIG Mesh 的入门系列教程

2万+

LeetCode 72. 编辑距离(成本)(Hard)

题目链接 题解 编辑距离 思路 代码 class Solution: ### 0121 动态规划(156 ms,18.3 MB) def minDistance(self, word1: str, word2: str) -> int: n1, n2 = len(word1), len(word2) # 若其中一个单词为空,则直接返回另一个单词的字符数 if n1 * n2 == 0: return.

newCraftsman的博客 244

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

caioj 1070 dp

题目描述 【问题描述】 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为“abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X的扩展串,这里“□”代表空格字符。 如果A1是字符串A的扩展串,B1是字符串B的扩展串,A1与B1具有相同的长度,那么我们定义字符串A1与B1的距离为相应位置上的字符的距离总和

fan233的博客 315

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

经典算法题每日演练——第五题 字符串相似度

这篇我们看看最长公共子序列的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网 页聚类等方面都有用武之地。 一:概念 对于两个字符串A和B,通过基本的增删改将字符串A改成B,或者将B改成A,在改变的过程中我们使用的最少步骤称之为“编辑距离”。 比如如下的字符串:我们通过种种操作,痉挛之后编辑距离为3,不知道你看...

weixin_30588729的博客 68

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

算法动态规划

动态规划题目的基本思路: 1.寻找dp数组下标及其含义; 2.根据题目找出递归公式; 3.初始化dp数组(有的题目初始化都为1,有的都为0,根据题目初始化); 4.遍历数组(例如,dp[i][j]看是先遍历i还是先遍历j); 5.打印dp数组。

2301_80168220的博客 2150
上一篇: 《算法之美》の链表问题の获得链表中倒数第m个元素
下一篇: 桶排序及其应用
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值