当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念)。观察树形的层级调用关系,我们可以发现动态规划隐式地嵌入了一种剪枝机制。

动态规划版求解菲波那切数列

关于朴素递归求解菲波那切数列存在的重复计算的说明:

红色部分均是重复计算项,当递归调用的层次更多时,重复计算的问题更为严重。

unsigned __int64 memo[1000];
unsigned __int64 fib(size_t n)
{if (n<=1)return n;if (memo[n])return memo[n];return memo[n] = fib(n-1) + fib(n-2);// 赋值运算(=)的也存在返回值,返回值是`=`号左侧的值// 对于第一次计算得到的值进行记录备份,// 下次如果想得到该值,先进性判断是否已经计算过了// 如果是,直接返回,见第二个if
}

动态规划版求解字符串编辑距离

我们来看朴素递归来求解字符串编辑距离时可能出现的重复计算的问题(5, 5:表示的是,源字符串和目标字符串各自的长度为5):

现在我们应用动态规划的思想对朴素递归算法进行改造,所谓动态规划,其核心有二:

  1. 状态的概念

    为递归接口增加状态标识参数ii和jj:

    int editDist(char* src, char* dst);

    改造为(引入状态的概念):

    int editDist(char* src, char* dst, int i, int j);
  2. 备忘录概念

    通过定义相关的结构体实现

    typedef struct tagMemoRecord
    {int dist;int refCount;
    }MEMO_RECORD;
    // 作为全局变量
    vector<vector<MEMO_RECORD>> memo(100, vector<MEMO_RECORD>(100));
int editDist(char* src, char* dst, int i, int j)
{if (memo[i][j].refCount){++memo[i][j].refCount;return memo[i][j].dist;}int dist = 0;if (strlen(src+i) == 0){dist = strlen(dst+j);}else if(strlen(dst+j) == 0){dist = strlen(src+i);}else{if (src[i] == dst[j]){dist = editDist(src, dst, i+1, j+1);}else{int editIns = editDist(src, dst, i, j+1) + 1;int editDel = editDist(src, dst, i+1, j) + 1;int editRep = editDist(src, dst, i+1, j+1) + 1;dist = std::min({editIns, editDel, editRep});}}memo[i][j].refCount = 1;return memo[i][j].dist = dist;
}

算法——动态规划算法求解字符串的编辑距离相关推荐

  1. 漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)

    在前两集漫画中,我们通过一个算法问题的完整解题过程,讲述了动态规划的基本概念和思想.没看过前两集的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 漫画说算法–动态规划算法 ...

  2. 五大常用算法——动态规划算法详解及经典例题

    一.基本概念 动态规划是运筹学中用于求解决策过程中的最优化数学方法.当然,我们在这里关注的是作为一种算法设计技术,作为一种使用多阶段决策过程最优的通用方法. 动态规划过程是:每次决策依赖于当前状态,又 ...

  3. 算法-动态规划算法总结

    1 基础问题 // 509. 斐波那契数 // 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 .该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.// dp[i]的 ...

  4. 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...

    矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...

  5. 算法-动态规划算法(详解)

    动态规划算法介绍 1)动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 2)动态规划算法与分治算法类似,其基本思想也是将 ...

  6. 漫画说算法--动态规划算法二(绝对通俗易懂,非常棒)

    在上一篇漫画中,我们分析了一道动态规划相关的算法问题,并归纳出了问题的状态转移方程式.没看过上一篇的朋友可以点击下面的链接: 漫画说算法–动态规划算法一(绝对通俗易懂,非常棒) 首先,让我们简单回顾一 ...

  7. 算法——动态规划算法

    动态规划法基本思想:将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解. 著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等. 个人对动态规划的理解,主要就是避免 ...

  8. 贪心、递归、递推以及动态规划算法的分析与对比

    PS:   头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...

  9. 以空间换时间——动态规划算法及其应用:矩阵链相乘

    动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...

最新文章

  1. 2020年人工神经网络第二次作业-参考答案第四题
  2. 最小生成树 Kruskal算法 Prim算法
  3. BZOJ 1024: [SCOI2009]生日快乐
  4. Cocos2d Box2D之简介
  5. wifi协议_以太网(Ethernet)和WiFi协议
  6. java万年历的两种实现方式
  7. CSRF攻击原理和防范措施
  8. ASP.NET Core 中文文档目录
  9. QTTabBar Windows资源管理器增强插件
  10. Word控件Spire.Doc 【页面背景】教程(8) ;在 C# 中将文本水印和图像水印添加到 Word 文档
  11. ios获取磁力计信息
  12. 【渗透工具】浏览器数据导出工具
  13. java环境变量设置 java_home
  14. \u202E与\u202D的RLO与LRO (QQ消息后缀 喵!)
  15. 怎么办理欧盟毒物通报中心(PCN)的UFI注册
  16. 2022年6月25日PMP考试通关宝典-6
  17. 这款开源的 Python 老照片修复工具火了
  18. 20211123 HDU练习 最短路和最小生成树
  19. Verilog代码设计之时分复用
  20. FCKeditor使用详解(汇总)

热门文章

  1. flink基本程序架构
  2. JDBC在spring中的使用
  3. tensorflow图片读取
  4. debian、ubuntu安装metasploit通用方法
  5. nettry 入站事件如何传递到下一个handler
  6. [No000011A]Office Excel设置显示日期与星期
  7. 对象流--对象的序列化
  8. Win10系统下面的TR1008解决方案
  9. javascript之事件处理
  10. Linux使用sendmail发送邮件