【常见笔试面试算法题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];}
};
【常见笔试面试算法题12续集六】动态规划算法案例分析6 最优编辑练习题相关推荐
- 【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 给定两个字符串A和B,返回两个字符串的最长公共子序列的长度.例如,A ...
- 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
加qq1126137994 一起学习更多技术!!! 有一个矩阵map,它每个格子有一个权值.从左上角的格子开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有 ...
- 【常见笔试面试算法题12续集一】动态规划算法案例1台阶问题练习题
加qq1126137994 一起学习更多技术!!! 以下问题,都可以用非动态规划的方法做,我为了整理动态规划的方法思路,就全部用动态规划的思路来解决问题,这样还可以简化问题的处理,是时间复杂度更低!! ...
- 【常见笔试面试算法题12续集五】动态规划算法案例分析5 01背包练习题
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 一个背包有一定的承重cap,有N件物品,每件都有自己的价值,记录在数 ...
- 【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法 ...
- 每日经典算法题(十六) 九九乘法表
每日经典算法题(十六) 九九乘法表 九九乘法表:Multiplication Table 99 题目 输出 9 * 9 口诀 程序分析 分行与列考虑,共9行9列,i 控制行,j 控制列 思路 非常经典 ...
- 武汉大学计算机学院自主招生考试内容,武汉大学自主招生笔试面试真题
武汉大学自主招生笔试面试真题2018-10-20 14:16:33文/叶丹 自主招生考试中,笔试和面试是考生和家长最为关注的,而每年都有关于自主招生脑洞大开的题目,大家很好奇自主招生考试都考什么?下面 ...
- 九月百度,迅雷,华为,阿里巴巴,最新校招笔试面试十题(更新至9.24)
题记 本博客自2010年10月11日开通以来,已经帮助了一大批人找到工作,特别是连续三年在每一年的9.10月份陪伴了至少三届毕业生找工作的旅程,包括校招中的笔试面试,今年也不会例外,我会在本博客开通3 ...
- 汇总5大Python常用笔试面试真题,知己知彼方能百战不殆
俗话说的好,打仗之前知晓敌方的军情越多,获胜的把握也会越大,知己知彼方能百战不殆嘛!换个角度来说,如今的面试不正是和古代打战一样嘛,知晓的越多,成功几率也就越大,小编今天就为大家汇总了5大Python ...
最新文章
- 13个JavaScript图表图形绘制插件
- mysql 查询rowno_C# Mysql 查询 Rownum的解决方法
- np实现sigmoid_使用numpy实现一个深度学习框架
- QQ在线客服代码,飘浮在右侧的QQ客服js特效演示
- c++命令模式command
- 1119:矩阵交换行
- python字符串转日期_Python:将字符串时间字典转换为日期时间
- wms地图绘制工具_移情地图,了解用户需求的利器
- android roboguice2,Android快速开发框架 roboguice
- 你一定要了解的NB-IoT !
- hibernate简单应用
- java 反射基础知识
- [原创]如何在Windows XP 中利用监视计算机中的资源使用情况
- sublime text编辑器修改python代码的缩进设风格
- Command(命令)
- 邮箱服务申请数字证书
- 计算机主机爆炸,意外:插入计算机后,主机的电源就会烧断。发生了什么?计算机电源爆炸了吗?...
- 知识推理——正向链接推理
- 剖析Linux的守护神
- 前端学习之路-聚美优品注册页面的实现