动态规划--最长公共子序列问题 O(nm)
来源:互联网 发布:sqlserver修改表数据 编辑:程序博客网 时间:2024/06/04 01:17
最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
例如:X(A,B,C,B,D,A,B)
Y (B,D,C,A,B,A)
那么最长公共子序列就是:B,C,B,A(细心地朋友已经发现了不止一种子序列,但长度一样,至于输出吗,就看代码吧)
算法设计:用动态规划方法解决
最长公共子序列的结构:
设X = { x1 , ... , xm },Y = { y1 , ... , yn }及它们的最长子序列Z = { z1 , ... , zk }则:
1、若 xm = yn , 则 zk = xm = yn,且Z[k-1] 是 X[m-1] 和 Y[n-1] 的最长公共子序列
2、若 xm != yn ,且 zk != xm , 则 Z 是 X[m-1] 和 Y 的最长公共子序列
3、若 xm != yn , 且 zk != yn , 则 Z 是 Y[n-1] 和 X 的最长公共子序列
子问题的递归结构:
当 i = 0 , j = 0 时 , c[i][j] = 0
当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1
当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }
问题的递归式写成:
回溯输出最长公共子序列过程图解:
算法分析:
由于每次调用至少向上或向左(或向上向左同时)移动一步,故最多调用(m + n)次就会遇到i = 0或j = 0的情况,此时开始返回。返回时与递归调用时方向相反,步数相同,故算法时间复杂度为O(m + n)。
- 动态规划--最长公共子序列问题 O(nm)
- 动态规划问题 最长公共子序列
- 动态规划:最长公共子序列问题
- 最长公共子序列问题--动态规划
- 动态规划-最长公共子序列问题
- 最长公共子序列问题 动态规划
- 最长公共子序列问题-动态规划
- 最长公共上升子序列 LCIS O(NM) 方案
- 动态规划问题:最长公共子序列问题
- 动态规划---LCS问题 最长公共子序列
- 动态规划解最长公共子序列问题
- 动态规划;最长公共子序列;LCS问题;
- HDU 1159 最长公共子序列问题 动态规划
- 动态规划解最长公共子序列问题
- 动态规划求解最长公共子序列问题
- 动态规划解最长公共子序列问题
- 动态规划解最长公共子序列问题
- 动态规划之最长公共子序列问题
- C# 匿名函数
- 面向对象和基于对象
- uva11987 Almost Union-Find(可删除元素的并查集)
- Android WebView 解决html中文乱码问题
- python中的分枝循环语句, 以及列表和元组的操作
- 动态规划--最长公共子序列问题 O(nm)
- python里的字符串常用内置方法和格式化操作
- 正则表达式语法
- ios 左右滑动手势
- 入门指引 - PHP手册笔记
- 使用Python进行socket编程
- HDU-1847-Good Luck in CET-4 Everybody!(又是巴什博弈)
- 离开通讯业入职互联网圈的一些感悟
- 最新证实:6种食物吃掉你的智商 你中招了吗?