(学习笔记,无什参考价值!)

1 问题

2 算法

2.1 Brute-force LCS algorithm

  • 检查每一个subsequence是否是yyy的子列时,遍历yyy的每一个元素,看是否依次可以全部覆盖subsequence所有元素,所以其复杂度为O(n)O(n)O(n);

2.2 Dynamic-programming hallmark #1

  • 动态规划的第一特征–最优子结构,下面用定理的方式证明这种特征;

  • 这个性质是说,一个规模稍大的最优解问题建立在一些规模较小的最优解问题基础之上,由此解决问题的思路就有两个方向:自顶向下的递归方式、自底向上的方式。

  • 很容易可以推出下面的(数量上的)性质:

  • 由上面的递归公式,首先想到的是使用递归实现:

  • 下面用递归树分析递归实现的时间复杂度:

  • 递归树的高度就是指数,所以时间复杂度是指数级别,和暴力解法没有什么大提高!

  • 从上面递归树图中观察到一个现象:递归树中存在大量重复的子问题,这些是导致递归算法龟速的原因,也是动态规划诞生的另外一个必要条件。

2.3 Dynamic-programming hallmark #2

  • 动态规划的第二特征–大量重复子问题

  • 有了这个特征,此时有两条改进思路,一是在递归过程中,存储算过的每一个子问题。算法描述如下:

  • 另外一个改进思路是自底向上算法:
  • 在上面自底向上的计算过程中,同时做了最优数值记录和最优路径记录这两件事,路径本质是:记录每一步由哪一个子问题得到父问题的解,路径的起点是(1,1),终点是(m,n),从终点到起点依照“来的时候做的箭头标记”,可以完整的回到起点,其中路径中标记’↘’路标的坐标点是最优解中的点。
  • 手工演示如下:

2.4 打印最优解

  • 依照上面的分析可以很容易找到一个倒序的LCS,结合递归实现原理,正好可以正序打印出LCS,算法如下:
  • 看这段代码,直觉上感觉还是倒序输出LCS,但是仔细考虑一下递归底层的运行过程,递归中的“递”就是入栈,递进;“归”就是出栈,回归,以倒序压入到栈中,以正序出栈;

3 代码实现

# -*- coding: utf-8 -*-
import numpy as npdef LCS_LENGTH(X, Y):m = len(X)n = len(Y)b = np.array([0] * (m * n)).reshape((m, n))c = np.array([0] * (m * n)).reshape((m, n))for i in range(1, m):c[i][0] = 0for j in range(0, n):c[0][j] = 0for i in range(1, m):for j in range(1, n):if X[i] == Y[j]:c[i][j] = c[i - 1][j - 1] + 1b[i][j] = 0elif c[i - 1][j] >= c[i][j - 1]:c[i][j] = c[i - 1][j]b[i][j] = '1'else:c[i][j] = c[i][j - 1]b[i][j] = '-1'return c, bdef PRINT_LCS(b, X, i, j):if i == 0 or j == 0:returnif b[i][j] == 0:PRINT_LCS(b, X, i - 1, j - 1)print(X[i])elif b[i][j] == 1:PRINT_LCS(b, X, i - 1, j)else:PRINT_LCS(b, X, i, j - 1)if __name__ == '__main__':X = ['x', 'A', 'B', 'C', 'B', 'D', 'A', 'B']Y = ['x', 'B', 'D', 'C', 'A', 'B', 'A']c, b = LCS_LENGTH(X, Y)PRINT_LCS(b, X, len(X) - 1, len(Y) - 1)

运行结果:

B
C
B
A

四、Dynamic-programming algorithm Dynamic--LCS相关推荐

  1. matlab实现k-l算法,Matlab实现动态规划算法 (dynamic programming algorithm)

    function [p_opt,fval]=dynprog(x,DecisFun,ObjFun,TransFun) % [p_opt,fval]=dynprog(x,DecisFun,ObjFun,T ...

  2. 动态规划(Dynamic Programming)与贪心算法(Greedy Algorithm)

    文章目录 动态规划算法(Dynamic Programming) 动态规划问题的属性 应用实例:最长公共子序列问题(Longest Common Subsequence, LCS) 贪心算法(Gree ...

  3. 动态规划 dynamic programming

    动态规划dynamic programming June,7, 2015 作者:swanGooseMan 出处:http://www.cnblogs.com/swanGooseMan/p/455658 ...

  4. 强化学习(二)- 动态规划(Dynamic Programming)

    3.动态规划 3.1 介绍 术语动态规划(DP:Dynamic Programming) 指的是一个算法集合,可以用来计算最优策略,给定一个完美的环境模型,作为马尔可夫决策过程(MDP).经典的DP算 ...

  5. ADPRL - 近似动态规划和强化学习 - Note 7 - Approximate Dynamic Programming

    Note 7 - 近似动态规划 Approximate Dynamic Programming 7. 近似动态规划 (Approximate Dynamic Programming) 7.1 近似架构 ...

  6. ADPRL - 近似动态规划和强化学习 - Note 5 - Banach Fixed Point Theorem in Dynamic Programming

    动态规划中的巴拿赫不动点定理 5. Banach Fixed Point Theorem in Dynamic Programming 5.1 巴拿赫不动点定理定理 (Banach fixed poi ...

  7. 一道有关动态规划(Dynamic Programming)的网易面试题

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器学习算法实验室 最近遇到一道很经典的有关动态规划的网 ...

  8. 动态规划(Dynamic Programming)例题步骤详解

    文章目录 动态规划(Dynamic Programming)浅学 - 学习笔记 题目特点: 1.选择硬币组合问题:(Coin Change) 动态规划题四个核心步骤: 一.确定状态 二.转移方程 三. ...

  9. 动态规划|Dynamic Programming

    由于最近课设要用动态规划,翻阅资料学习一下. 动态规划 解决复杂问题的方法,把它们分解成更简单的子问题. 一旦我们看到一些例子,这个定义就有意义了.实际上,我们今天只看解问题的例子 解决DP问题的步骤 ...

  10. 动态规划问题(Dynamic Programming)

    一.什么是动态规划? 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法. 20 世纪 50 年代初 R. E. ...

最新文章

  1. 【 Vivado 】Performing System-Level Design Entry(总览)
  2. 《基于张量网络的机器学习入门》学习笔记6
  3. IOS 学习笔记 2015-03-22 OC-API-日期
  4. Java实现二维数组和稀疏数组的转换
  5. 卓同学的 Swift 面试题
  6. 如何运用DDD - 实体
  7. WinForm 中 comboBox控件之数据绑定
  8. python 线性回归模型_如何在Python中建立和训练线性和逻辑回归ML模型
  9. The requested URL /xxxx.html was not found on this server
  10. Spark源码阅读@ListenerBus 的实现
  11. vb杨辉三角代码编写_VB语言中输出杨辉三角形的方法
  12. java基础练习题(含答案共39道)-语言基础篇
  13. 工业智能网关,数据采集网关
  14. php怎样转换jpg,php pdf如何转jpg
  15. 黑科技网站推荐 第一弹 RemoveBg [一键抠图]
  16. 使用Webupload上传图片到FastDFS分布式文件系统
  17. Python+OpenCV中的Shi-Tomasi角点检测实现(附代码)
  18. AR涂涂乐项目之识别图制作制作地球仪剪影一
  19. 测试抑郁症的20道题(三)
  20. 判断两个数是否互为素数(质数)

热门文章

  1. 前端学习(1124):思考题
  2. shiro学习(20): 自定义过滤规则
  3. mybatis学习(7):Windows下安装MySQL详细教程
  4. python一看就很厉害的代码_Python学习教程:怎么写出让人看起来就很舒服的代码?...
  5. Zabbix 3.0 配置企业微信报警(注册---测试)
  6. mysql isnull
  7. STM32 软件模拟 IIC 代码,标准库、HAL库可用
  8. 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】
  9. 【转】java提高篇(二)-----理解java的三大特性之继承
  10. bzoj2060[USACO2010,Nov]Visiting Cows拜访奶牛