Pascal最长公共子序列问题.pptVIP

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Pascal最长公共子序列问题.ppt

两个模型 最长上升子列问题LIS; 最长公共子序列问题 ; 分析: 1.考虑某个位,到达该位的最长上升序列只与其前面位的数字有关而与其后面位无关,即具有子结构性质; 2.设F[I]表示第I位数字的最长上升子序列长度,则F[I]值只与当A[J]A[I](JI)对应的子序列有关,容易获得: F[I]=MAX{F[J](A[J]A[I](JI))}+1 3.自底向上的方式计算问题的最优值,显然F[I]的初值为1 改进算法: 原算法的弊端是每次需要花O(n)的时间寻找最优子序列. 由于s[K]值是单调上升 (1)考虑到a[i]元素时,用二分法在s[k]中寻找最大的一个k使s[k]a[I],让f[I]=k+1,否则f[I]保留原值. (2)IF A[I] S[f[I]] THEN 更新S[f[I]]=A[I] 这样,使算法的复杂度下降为O(nlog2n)。 【问题】 求两字符序列的最长公共字符子序列 问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列i0,i1,…,ik-1,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。 考虑最长公共子序列问题如何分解成子问题,设A=“a0,a1,…,am-1”,B=“b0,b1,…,bm-1”,并Z=“z0,z1,…,zk-1”为它们的最长公共子序列。不难证明有以下性质: (1) 如果am-1=bn-1,则zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一个最长公共子序列; (2) 如果am-1bn-1,则若zk-1am-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列; (3) 如果am-1bn-1,则若zk-1bn-1,蕴涵“z0,z1,…,zk-1”是“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列。 这样,在找A和B的公共子序列时,如有am-1=bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个最长公共子序列;如果am-1!=bn-1,则要解决两个子问题,找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列和找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列,再取两者中较长者作为A和B的最长公共子序列。 求解:引进一个二维数组c[][],用c[i][j]记录X[i]与Y[j] 的LCS 的长度,b[i][j]记录c[i][j]是通过哪一个子问题的值求得的,以决定搜索的方向。 我们是自底向上进行递推计算,那么在计算c[i,j]之前,c[i-1][j-1],c[i-1][j]与c[i][j-1]均已计算出来。此时我们根据X[i] = Y[j]还是X[i] != Y[j],就可以计算出c[i][j]。 问题的递推式写成: 回溯输出最长公共子序列过程: * * 最长上升子列问题LIS 问题: 给出一个数列,要求从这个数列中找出一个最长的子列,使得这个子列的元素是严格单调上升的。 输入: 第一行是一个数N,表示数列的长度。第二行是N个数,表示这个数列。其中N=300000。 输出: 输出仅有一个数,最长子列的长度。 样例输入: 6 3 7 2 4 6 8 样例输出: 4 以下是对样例的模拟操作分析 4 3 2 1 2 1 8 6 4 2 7 3 设a[i]为第i个数,f[i]为到第i个数最长上升子序列的大小,初始时f[i]=0,f[1]=1, procedure main; var i,j,max:integer; begin max:=1; f[1]:=1; for i:=2 to n do begin for j:=1 to i-1 do{求符合条件子列最大值} if (a[j]a[i]) and (f[j]f[i]) then f[i]:=f[j]; inc(f[i]);{子列最大值加1} if f[i]max then max:=f[i]; end; writeln(

文档评论(0)

lingyun51 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档