2019-2020 学年第二学期算法分析与设计实验报告
实验七:动态规划法求解最长公共子序列问题
班级:1805117 学号: 180511741 姓名:禹鸽
实验内容: 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字
符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列 X=(x
0
,x
1
,…,x
m-
1
),序列 Y=(y
0
,y
1
,…,y
k-1
)是 X 的子序列,存在 X 的一个严格递增下标序列
(i
0
,i
1
,…,i
k-1
),使得对所有的 j=0,1,…,k-1,有 =y
j
。子序列:例如,
X=(a,b,c,b,d,a,b),Y=(b,c,d,b)是 X 的一个子序列。给定两个字符序列 A
和 B,如果字符序列 Z 既是 A 的子序列,又是 B 的子序列,则称序列 Z 是 A 和 B 的公共子
序列。该问题是求两序列 A 和 B 的最长公共子序列(LCS)。
实验目的:掌握动态规划法求解问题的一般步骤
实验环境:(包括硬件环境和软件环境)Visual Studio 2019
实验步骤:(详细记录算法设计过程和实验过程,注意流程图格式规范)
分析:
为了找到最长的 LCS,我们定义 c[i][j]记录序列 LCS 的长度,公共子序列 LCS 长度为 0,
即 c[i][j]=0,所以用 i 和 j 分别表示序列 s1 的长度和序列 s2 的长度,状态转移方程为
c[i][j] = 0 如果 i=0 或 j=0
c[i][j] = c[i-1][j-1] + 1 如果 s1[i-1] = s2[j-1]
c[i][j] = max{ c[i-1][j], c[i][j-1] } 如果 s1[i-1] != s2[j-1]
评论0
最新资源