最长公共子序列(动态规划)

本文详细介绍了最长公共子序列问题的动态规划解决方案,通过构建二维数组c[i][j]记录比较结果,并使用Z字形顺序进行比较。在不同情况下的递推公式被阐述,并提到了如何利用追踪数组rec[i,j]找到最长公共子序列。内容涵盖了动态规划的基本思路和具体实现步骤。
摘要由CSDN通过智能技术生成

最长公共子序列(动态规划算法)

一、思路

在寻找最长公共子序列的过程中,我们要构建一个二维数组c[i][j],来记录数组X和Y中元素比较的结果。
在这里插入图片描述
比较时,有两种可能:
可能一:
在这里插入图片描述
可能二:
在这里插入图片描述
在开头我们已经知道,二维数组c[i][j]用来记录数组X和Y中元素比较的结果,那么当数组X或Y长度为0时,最长公共子序列为0,所以当 i=0或j=0时,c[i,j]=0。(c[i,0]=c[0,j]=0)
在这里插入图片描述
综上所述,就有整体的递推公式:
在这里插入图片描述
在比较过程中,我们采用Z字形顺序:在这里插入图片描述
并且还要构造追踪数组rec[i,j],来记录c[i,j]是根据c[i-1,j-1],c[i-1,j],c[i,j-1]中的哪个推出来的,并在最后通过追踪数组找出最长公共子序列。
在这里插入图片描述
下图为比较结果:
即X[i]与Y[j]比较,如果相同,则为c[i][j]=c[i-1][j-1]+1;
如果不同,则c[i][j]=max{c[i-1][j],c[i][j-1]}(c[i-1][j]和c[i][j-1]相同时,默认为c[i-1][j])。
rec[]中记录c[i,j]的来源。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值