算法分析与设计实践-作业9-动态规划之最长公共子序列问题

动态规划之最长公共子序列问题(LCS)

1.问题

给定序列X=<x1, x2,…, xm>,Y=< y1, y2,…, yn>,求X和Y的最长公共子序列。

2.解析

设X=<x1,x2,…,xm>,Y=<y1,y2…,yn>为两个序列,Z=<z1,z2,…,zk>是他们的任意公共子序列。
经过分析可得:
1、xi = yj,那么zk = xi = yj ,Zk-1是Xi-1和Yj-1的最长公共子序列
2、xi != yj,zk != xi ,那么Zk是Xi-1和Yj的最长公共子序列
3、xi != yj,zk != yj ,那么Zk是Xi和Yj-1的最长公共子序列

在这里插入图片描述

因此,我们先把dp数组的第一行和第一列进行赋值为0,然后从dp[1][1]开始填表,填到dp[m][n],所得到的dp[m][n]就是LCS的长度。
实例:X=<A,B,C,B,A>,Y=<B,D,C,A,A>

第一行和第一列初始化为0
在这里插入图片描述
若Xi和Yj不相等,所填的值为上方或左方大的那个

在这里插入图片描述
若Xi和Yj相等,所填的值为左上方的值加1

在这里插入图片描述

按照此规律填表,最终可以得到如下表的数据

在这里插入图片描述

由表可得,X和Y序列的最长公共子序列长度为2
为了最终能获得X和Y序列的最长公共子序列,我们需要一个二维数组来进行标记,具体看设计的板块。

3.设计

在这里插入图片描述

4.分析

时间复杂度:T(n)=O(m*n)

5.源码

https://github.com/lu-225/As-before/blob/master/2018212212124%20%E9%99%86%E5%AE%B6%E8%BE%89%20%E5%AE%9E%E9%AA%8C9/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E4%B9%8B%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97%E9%97%AE%E9%A2%98.cpp

猜你喜欢

转载自blog.csdn.net/qq_43633353/article/details/105802302