动态规划算法学习二:最长公共子序列
文章目录
- 前言
- 一、问题描述
- 二、DP实现
- 1、最优子结构性质*****
- 2、状态表示*****
- 3、状态递归方程*****
- 4、计算最优值*****
- 5、代码实现:输出最长公共子序列
- 6、代码实现:输出最优解
前言
一、问题描述
- 列举X的所有子序列,然后检查它是否也是Y的子序列,从而确定它是否是X和Y的公共子序列。
枚举算法
的时间复杂度为指数级时间复杂度。
二、DP实现
1、最优子结构性质*****
注意: 可能同时有多个长度相等的最长公共子序列!
倒推—从最后一个元素开始分析
2、状态表示*****
输入序列对(X(m-1),Y(n-1) ),(X(m-1),Yn ) 和(Xm,Y(n-1) )都分别表示一个子问题 (xm等于或不等于yn,都可以分解为这三个子问题)
子问题可以通过两个参数确定,即序列 X 的长度和序列 Y 的长度
C(i,j)表示序列Xi={x1,x2,…,xi }和Yj={y1,y2,…,yj } 的最长公共子序列长度
C(m, n)则表示原问题的最长公共子序列长度
3、状态递归方程*****
- 当i=0或j=0时,C(i,j)=0;
- 当i, j>0时,C(i,j)的求解包括
两种情况
:- xi=yj时, (X(i-1),Y(j-1) )的最长公共子序列末尾添加元素xi (=yj),即可得到(Xi,Yj )的最长公共子序列
- xi≠yj时,(Xi,Yj )的最长公共子序列等于(Xi,Y(j-1) )和(X(i-1),Yj )的最长公共子序列的较大者。
4、计算最优值*****
注意:
当第一次遍历 自底向上求解时,X[1] != Y[1],所以走第三条路:求c[0][1] c[1][0]的最大值,但是这两个值都是0,所以取哪一个都可以,所以后续求最长公共子序列的 序列时,这里的左箭头和上箭头都是一样的,
- 第一次遍历:
5、代码实现:输出最长公共子序列
代码的输出 就是最长公共子序列的长度
public class Main {public static int MAX = 1000;public static int lcsLength(char[] strX,char[] strY) {int[][] C = new int[MAX][MAX], B = new int[MAX][MAX];int i, j;int m = strX.length + 1;int n = strY.length + 1;for (i = 0; i < m; i++)C[i][0] = 0; //初始化第一行for (j = 0; j < n; j++)C[0][j] = 0; //初始化第一列for (i = 1; i < m; i++) {for (j = 1; j < n; j++) {if (strX[i-1] == strY[j-1]) {C[i][j] = C[i-1][j-1] + 1;B[i][j] = 1;} else if(C[i - 1][j] >= C[i][j - 1]) {C[i][j] = C[i-1][j];B[i][j] = 2;} else {C[i][j] = C[i][j-1];B[i][j] = 3;}}// end for(j}//end for(ireturn C[m - 1][n - 1];}public static void main(String[] args) {char[] x = {'A', 'B', 'C', 'B', 'D', 'A', 'B'};char[] y = {'B', 'D', 'C', 'A', 'B', 'A'};int i = lcsLength(x, y);System.out.println(i);}
}
6、代码实现:输出最优解
动态规划算法学习二:最长公共子序列相关推荐
- 动态规划算法之:最长公共子序列 最长公共子串(LCS)
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...
- 算法知识之最长公共子序列问题(动态规划)
最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...
- 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
出处 http://segmentfault.com/blog/exploring/ 本章讲解: 1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度: 2. 与之类似但不 ...
- 【算法】动态规划法——最长公共子序列(LCS)
前言 这篇是大三算法分析与设计课程的第一篇博客,写他是因为上课学到了,并且也算是留作记忆,以后学习时方便使用. 这篇博客主要想讲讲动态规划法,然后以LCS问题为例展开来说一下怎么利用动态规划法求解它, ...
- 文本比较算法Ⅶ——线性空间求最长公共子序列的Nakatsu算法
在参阅<A Longest Common Subsequence Algorithm Suitable for Similar Text Strings>(Narao Nakatsu,Ya ...
- 动态规划表格法解决最长公共子序列(LCS)问题
3.5 最长公共子序列(LCS) 前言:图片是博主自己画的,转载请注明出处哦 3.5.1 问题描述 最长公共子序列(Longest Common Subseuence,LCS)问题:给定两个字符串,求 ...
- 【动态规划】LeetCode 1143最长公共子序列
题目链接:力扣 思路: 动态规划: dp[i][j]表示text1[0:i) 和 text2[0:j)的最长公共子序列的长度 上述表示中,text1[0:i)的长度为i的前缀,text2[0:j)表示 ...
- 动态规划(四)--最长公共子序列
最长公共子序列问题 一种相似度的概念:一个给定的序列的子序列是将序列中零个或多个元素去掉之后得到的结果. 定义:给定一个序列X=<x1,x2,...,xm>,另一个序列Z=<z1,z ...
最新文章
- 让人造太阳更近!DeepMind强化学习算法控制核聚变登上Nature
- 秘籍:设计模式PDF学习笔记!
- 1.4编程基础之逻辑表达式与条件分支_16三角形判断(9分)
- 2008年3月移动开发Webcast预告
- java访问hdfs_HDFS的java访问接口
- C++ 从入门到入土(English Version)Section4: Random numbers + machine code
- 随机信号功率谱估计方法matlab仿真
- 【工具】损坏视频文件修复MP4/MOV格式
- 影响世界的100个管理定律
- 麒麟系统编译网卡驱动
- 打开CMD的方式及常用的DOS命令
- win10开机启动慢如何解决?三种方法帮你解决!
- 数字图像处理技术及实用 MATLAB实验报告及PS作业
- POJ 3055 Digital Friends 笔记
- 默认路由的配置(锐捷)
- Sql 语句优化总结
- java之HeapByteBufferDirectByteBuffer以及回收DirectByteBuffer
- 从数据库中查找数据并按首字母排序
- python ddt安装
- ubuntu 耳机有电流声的解决办法
热门文章
- 天下奇观:每天设千人免费宴
- 从阿里系跳槽国企,平薪50万被媳妇阻拦!吃亏了?
- MacBook的程序坞(任务栏)主屏副屏幕切换
- 未来手机是否能替代计算机,在未来智能手机能代替电脑吗?
- Matlab保存与原图同样大小的图像
- SnapHelper解析
- hadoop-hive1
- hadoop可以解决什么问题_一个50岁的人负债累累,干点什么能解决问题?可以做这些...
- std::string 收缩到合适大小_自来水流量大小对家庭中打算使用智能马桶花洒等涉水产品选型的影响以及浅谈增压水泵的选型...
- 戴尔 成铭3980台式计算机,高性能商务办公体验 戴尔成铭3980台式机评测