LCS问题的深入探讨

在上一篇博客中我简单的说明了LCS的算法原理和DP方程,但这是远远不够的,我们还要考虑如何实现。
这里写图片描述
观察这个DP方程,我们感觉它的结构类似于树,就像这样:这里写图片描述
我们可以用搜索的方法来求解,但是会有许多重复。
就像上图中(6 4)被搜了两遍,也许后面还会搜到。
大量的重复会导致效率的降低,所以我们要设计一种解决方法。
这种解决方法叫做备忘法,其实很简单,就好像你做了一个备忘录,每次搜索时都查询一次这个点是否搜过,如果搜过就不必再搜了。
这是代码:

LCS(i,j)
{
    if(c[i][j]==nil)//说明没有搜过; 
     then if(x[i]=y[j])
          then c[i][j]=LCS(i-1,y-1)+1;
          else c[i][j]=max(LCS(i-1,j),LCS(i,j-1));//两种情况; 
          return c[i][j];
} 

其实没啥改动。
这种方法能有效的避免重复。
当然还有一种方法,那就是自底而上的搜(在树上可以这么说,实际就是递推)。
我们先列个表格:
这里写图片描述
这表格确实丑。。
这个表格是从上到下一行一行推过去的,每个点只与他上面,左面的,左上方的三个点有关系。
(这种顺序在树上确实是从底到上的。)
这一点符合动态规划的原理,所以说这种方法才是真正的动态规划。(这种比较充分体现了动态规划的高效)。
oh yes!
溜了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值