学习交流加

  • 个人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];}
};

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

  1. 【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 给定两个字符串A和B,返回两个字符串的最长公共子序列的长度.例如,A ...

  2. 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

    加qq1126137994 一起学习更多技术!!! 有一个矩阵map,它每个格子有一个权值.从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有 ...

  3. 【常见笔试面试算法题12续集一】动态规划算法案例1台阶问题练习题

    加qq1126137994 一起学习更多技术!!! 以下问题,都可以用非动态规划的方法做,我为了整理动态规划的方法思路,就全部用动态规划的思路来解决问题,这样还可以简化问题的处理,是时间复杂度更低!! ...

  4. 【常见笔试面试算法题12续集五】动态规划算法案例分析5 01背包练习题

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数 ...

  5. 【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法 ...

  6. 每日经典算法题(十六) 九九乘法表

    每日经典算法题(十六) 九九乘法表 九九乘法表:Multiplication Table 99 题目 输出 9 * 9 口诀 程序分析 分行与列考虑,共9行9列,i 控制行,j 控制列 思路 非常经典 ...

  7. 武汉大学计算机学院自主招生考试内容,武汉大学自主招生笔试面试真题

    武汉大学自主招生笔试面试真题2018-10-20 14:16:33文/叶丹 自主招生考试中,笔试和面试是考生和家长最为关注的,而每年都有关于自主招生脑洞大开的题目,大家很好奇自主招生考试都考什么?下面 ...

  8. 九月百度,迅雷,华为,阿里巴巴,最新校招笔试面试十题(更新至9.24)

    题记 本博客自2010年10月11日开通以来,已经帮助了一大批人找到工作,特别是连续三年在每一年的9.10月份陪伴了至少三届毕业生找工作的旅程,包括校招中的笔试面试,今年也不会例外,我会在本博客开通3 ...

  9. 汇总5大Python常用笔试面试真题,知己知彼方能百战不殆

    俗话说的好,打仗之前知晓敌方的军情越多,获胜的把握也会越大,知己知彼方能百战不殆嘛!换个角度来说,如今的面试不正是和古代打战一样嘛,知晓的越多,成功几率也就越大,小编今天就为大家汇总了5大Python ...

最新文章

  1. 13个JavaScript图表图形绘制插件
  2. mysql 查询rowno_C# Mysql 查询 Rownum的解决方法
  3. np实现sigmoid_使用numpy实现一个深度学习框架
  4. QQ在线客服代码,飘浮在右侧的QQ客服js特效演示
  5. c++命令模式command
  6. 1119:矩阵交换行
  7. python字符串转日期_Python:将字符串时间字典转换为日期时间
  8. wms地图绘制工具_移情地图,了解用户需求的利器
  9. android roboguice2,Android快速开发框架 roboguice
  10. 你一定要了解的NB-IoT !
  11. hibernate简单应用
  12. java 反射基础知识
  13. [原创]如何在Windows XP 中利用监视计算机中的资源使用情况
  14. sublime text编辑器修改python代码的缩进设风格
  15. Command(命令)
  16. 邮箱服务申请数字证书
  17. 计算机主机爆炸,意外:插入计算机后,主机的电源就会烧断。发生了什么?计算机电源爆炸了吗?...
  18. 知识推理——正向链接推理
  19. 剖析Linux的守护神
  20. 前端学习之路-聚美优品注册页面的实现

热门文章

  1. 第一百一十二期:96秒100亿!如何抗住双11高并发流量?
  2. spring mvc学习(4):第一个spring mvc项目
  3. 第四十七期:毕业3年Java程序员,年薪20W,他是如何达到的?
  4. 6用NetBeans进行JSP开发
  5. 实例1:python(续)
  6. 树莓派使用STEP1:装系统
  7. db2存储结构换Oracle,DB2中实现Oracle的功能
  8. API网关从入门到放弃
  9. day02 pycharm 安装
  10. 3 View - 状态保持 session