动态规划

  最长公共子序列问题:

伪代码:

  1. Procedure LCS_LENGTH(X,Y);LCS_LENGTH(X,Y);
  2. begin 
  3.    m:=length[X];
  4.    n:=length[Y];
  5. for i:=to m do c[i,0]:=0;
  6. for j:=to n do c[0,j]:=0;
  7. for i:=to m do 
  8.    for j:=to n do 
  9.       if x[i]=y[j] then 
  10.         begin
  11.            c[i,j]:= c[i-1,-1]+ 1; 
  12.            b[i,j]:="↖"; 
  13.         end 
  14.       else if c[-1,j]≥ c[i,-1then
  15.         begin
  16.            c[i,j]:c[i-1,j];
  17.            b[i,j]:"↑" ; 
  18.         end 
  19.       else 
  20.         begin 
  21.            c[i,j]:c[j-1];
  22.            b[i,j]:="←" 
  23.         end;
  24.    return(c,b);
  25. end

在这个问题中图示:

在LCS算法中,每一次递归调用使i或j减1,因此算法的时间复杂度为O(m+n)。
   例如,设所给的两个序列为X=<A,B,C,B,D,A,B>和Y=<B,D,C,A,B,A>。由算法LCS_LENGTH和LCS计算出的结果如下图所示:

   
   
   我来说明下此图(参考算法导论)。在序列X={A,B,C,B,D,A,B}和 Y={B,D,C,A,B,A}上,由LCS_LENGTH计算出的表c和b。第i行和第j列中的方块包含了c[i,j]的值以及指向b[i,j]的箭头。在c[7,6]的项4,表的右下角为X和Y的一个LCS<B,C,B,A>的长度。对于i,j>0,项c[i,j]仅依赖于是否有xi=yi,及项c[i-1,j]和c[i,j-1]的值,这几个项都在c[i,j]之前计算。为了重构一个LCS的元素,从右下角开始跟踪b[i,j]的箭头即可,这条路径标示为阴影,这条路径上的每一个“↖”对应于一个使xi=yi为一个LCS的成员的项(高亮标示)。

所以根据上述图所示的结果,程序将最终输出:“B C B A”。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值