【常见笔试面试算法题12续集六】动态规划算法案例分析6 最优编辑练习题

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

对于两个字符串A和B,我们需要进行插入、删除和修改操作将A串变为B串,定义c0,c1,c2分别为三种操作的代价,请设计一个高效算法,求出将A串变为B串所需要的最少代价。

给定两个字符串A和B,及它们的长度和三种操作代价,请返回将A串变为B串所需要的最小代价。保证两串长度均小于等于300,且三种代价值均小于等于100。

测试样例:
“abc”,3,“adc”,3,5,3,100
返回:8

解题思路:
假设A的长度为n,B的长度为m,首先生成一个dp矩阵,dp[n+1]m+1,dp[i][j]代表将A[0(i-1)]变成B[0(j-1)]的最小代价。
1、先求第一行:
dp[0][j],将空串变成B[0…j-1],直接一个一个插入:

for(int j=0;j<m+1;j++){dp[0][j]=j*ic;//ic代表插入的操作的代价}

2、再求第一列:
将A[0…i-1]变成空串,直接一个一个删除:

for(int i=0;i<n+1;i++){dp[i][0]=i*dc;//dc代表删除的操作代价}

3、求其他行的值:
求其他行的值,可以大致分为以下四种情况:

一、
先把A[0(i-1)]编辑成A[0(i-2)],也就是删除字符A[i-1],再将A[0(i-2)]编辑成B[0(j-1)],dp[i-1][j],所以:
dp[i][j]=dc+dp[i-1][j]

二、
先把A[0(i-1)]编辑成B[0(j-2)],即dp[i][j-1],再将B[0~(j-2)]插入B[j-1],所以:
dp[i][j]=ic+dp[i][j-1]

三、
如果A[i-1]!=B[j-1],那么先把A[0(i-2)]编辑成B[0(j-2)],然后把A[i-1]替换成B[j-1]即可!!!所以:
dp[i][j]=rc+dp[i-1][j-1];

四、
如果A[i-1]=B[j-1],那么直接把A[0(i-2)]编辑成B[0(j-2)],即可,所以:
dp[i][j]=dp[i-1][j-1];

选出以上四种情况的最小值,就是最终dp[i][j]的值。

综上编写程序如下:

class MinCost {
public:int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) {// write code hereint ic=c0,dc=c1,rc=c2;int dp[n+1][m+1];//先求第一行dp[0][j],将空串变成B[0...j-1],直接一个一个插入for(int j=0;j<m+1;j++){dp[0][j]=j*ic;}//再求第一列,将A[0...i-1]变成空串,直接一个一个删除for(int i=0;i<n+1;i++){dp[i][0]=i*dc;}//再求其他行,从上到下,从左往右计算for(int i=1;i<n+1;i++){for(int j=1;j<m+1;j++){int Min_Num=min(dc+dp[i-1][j],ic+dp[i][j-1]);if(A[i-1]!=B[j-1]){Min_Num=min(rc+dp[i-1][j-1],Min_Num);}else{Min_Num=min(dp[i-1][j-1],Min_Num);}   dp[i][j]=Min_Num;}}return dp[n][m];}
};

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

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

相关文章

shell 思维导图

分享一下&#xff1b;

《大败局》读书笔记

史玉柱犯了一个很多青年企业家都容易犯的错误&#xff1a;把预期的利润当成了实际的收益&#xff0c;并以此为基数来设定自己的规划。 制度重于技术。 秩序重于利益。 职业人格缺陷。 市场是很公平的&#xff0c;你怎么从暴利中得来的钱&#xff0c;你得再怎么赔进去。 如果管理…

计数排序的应用----排序字符串

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 题目&#xff1a; 给你一个原始字符串&#xff0c;根据该字符串内每一个字符串出现的次数&#xff0c;按照ASCII码递增的排序重新调整输出。 举例: eeefgghh 则每种字…

Linux 总线、设备、驱动模型的探究

学习交流加 个人qq&#xff1a;1126137994 个人微信&#xff1a;liu1126137994 学习交流资源分享qq群&#xff1a;962535112之前一直做项目&#xff0c;做项目的过程虽然也学习到了不少知识&#xff0c;但是&#xff0c;一直没有好好研究总线设备驱动的机制&#xff0c;今天来学…

面试题:移动数组的元素

加qq 1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 描述 试设计一个算法&#xff0c;将数组a中的元素a[0]至a[n-1]循环右移k位&#xff0c;并要求只用一个元素大小的附加存储&#xff0c;元素移动或交换次数为O(n)。 输入 先输入一个大于1且小于100的…

n个字符串按照字典序排列

题目描述 给定n个字符串&#xff0c;请对n个字符串按照字典序排列。 输入描述: 输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。 输出描述: 数据输出n行&#xff0c;输出结果为按照字典序排列的字符串。 输入例子:…

二叉树的层序遍历详细讲解(附完整C++程序)

加qq1126137994 微信liu1126137994 一起学习更多技术 1、原理&#xff1a; 层序遍历所要解决的问题很好理解&#xff0c;就是按二叉树从上到下&#xff0c;从左到右依次打印每个节点中存储的数据。如下图&#xff1a; 按层序遍历的原则&#xff0c;打印顺序依次应该是&…

不同DPI下窗体的自适应的有关注意点(转)

不同DPI下窗体的自适应的有关注意点&#xff08;转自&#xff1a;http://hi.baidu.com/superkinger/blog/item/79e047ec6c80563526979197.html&#xff09; 1. 在设计窗体的时候需要考虑是否允许程序在不同DPI自适应窗体&#xff0c;不自适应的优点是在不同的DPI下看到的…

【C++深度剖析教程30】C++中抽象类和接口

加qq1126137994 微信&#xff1a;liu1126137994 1、面向对象中的抽象概念; 在现实中&#xff0c;需要知道具体的图形类型才能知道如何求面积&#xff0c;但是对于抽象的‘图形’&#xff0c;我们是没法求其面积的&#xff0c;而且对其求面积也是没有意义的&#xff1a; cl…

有效沟通力思维导图

有效沟通&#xff0c;适用于生活和工作中&#xff0c;甚至是孩子教育上面&#xff0c;分享一下&#xff1b;

[转]Microsoft Solution Framework 微软解决方案框架结构

本文转自&#xff1a;http://baike.baidu.com/view/1291436.htmMSF&#xff08;Microsoft Solution Framework&#xff09;微软解决方案框架结构是一组建立、开发和实现分布式企业系统应用的工作模型、开发准则和应用指南。它帮助企业融合商业和技术的目标&#xff0c;降低采用…

指针的大小与什么有关

指针的大小与什么有关&#xff1f; cpu位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09;操作系统位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09;编译器的位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09; 当上述3种位数不…

数据结构思维导图

学习是一个不断渐进的过程&#xff0c;最近整理了一下数据结构思维导图&#xff0c;分享一下&#xff0c;后续更新中 总结&#xff1a;算法实际上属于&#xff0c;数据建模&#xff0c;首先是问题的抽象&#xff0c;采用数学公式来表示&#xff08;数据建模&#xff1a;将问题…

(转)代理模式(Proxy)

原文地址&#xff1a;http://www.cnblogs.com/QinBaoBei/archive/2010/05/18/1737866.html 为了深刻点理解代理模式&#xff0c;我们先来看一个 Demo &#xff0c; 首先这个 Demo 是用来测试 QQ 号码是否在线&#xff0c; 这里涉及到的内容是 Web 服务的使用&#xff0c; 这个 …

【C++深度剖析教程31】被遗弃的多重继承

加qq1126137994 微信&#xff1a;liu1126137994 C中是否允许一个类继承多个父类&#xff1f; C支持编写多重继承的代码&#xff1a; 一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承父类所有的成员函数子类对象可以当做任意父类对象使用 多重继承的语法规则&a…

zookeeper思维导图

之前用word文档记笔记&#xff0c;但是没有思维导图清晰&#xff0c;又整理了一下&#xff0c;分享一下&#xff1b;

管理软件本质论

我们上管理软件到底是为了什么&#xff1f;1 为员工提供自动化工具&#xff0c;可以让他们节省出更多的时间可以做更多的工作&#xff1f;2 可以通过管理软件的互联网联网特性或局域网联网特性&#xff0c;让部门和部门之间、总部和分公司之间按业务流程通常运营&#xff1f;2 …

【C++深度剖析教程32】new/malloc区别 delete/free区别

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、new与malloc的区别&#xff1a; new是关键字&#xff0c;它是C语言的一部分&#xff0c;而malloc是由C库提供的函数new分配的内存的单位是具体的类型大小&#xff0c…

redis 思维导图

之前整理的redis 思维导图&#xff0c;分享一下&#xff0c;后续持续更新;

软件汉化教程

看到网上经常有人问汉化方面的东西&#xff0c;我今天也来灌水一篇&#xff0c;来个汉化扫盲教程。写的不好的地方欢迎大家指正&#xff01;OK&#xff0c;现在我们进入正题。我这里所说的汉化&#xff0c;是指汉化 Windows 下的 PE 文件&#xff0c;把其他语言界面的程序翻译为…