先简单介绍下什么是最长公共子序列问题,其实问题很直白,假设两个序列X,Y,X的值是ACBDDCB,Y的值是BBDC,那么XY的最长公共子序列就是BDC。这里解决的问题就是需要一种算法可以快速的计算出这个最大的子序列,当然,用最简单的方法就是列出XY全部的子系列然后一个个对比,但这样的时间复杂度是绝对不能接受的。假设X的长度是m,Y的长度是n,拿X的一个子序列和Y进行对比的时间是n,计算X的全部子序列的时间是2^m,所以,如果采用的是一个个全部计算的话,将会花费n*2^m的时间,指数级别的时间复杂度是爆炸式的。我们这里解决的方法是采用动态规划的方式,所以再讲问题之前,先简单提下动态规划的概念。
动态规划
动态规划是通过组合子问题的解而解决整个问题的,说到这里,是不是有些熟悉?在先前的归并排序中采用的分治法其实也是对子问题进行分析,但有所不同的是,分治法的思想是通过将问题分解为多个子问题,然后一一解决,最后合并子问题就得到了原问题的答案。当然,分治法所适用的领域就是子问题没有相互的关联,而动态规划所就没那么简单了,它的子问题一般都是由相互关联的情况,也就是说子问题包含了公共的子子问题。什么叫公共的子子问题,就是一个子问题继续分解,另一个子问题也继续分解,然后它们惊讶的发现它们分解出来的问题竟然是一样的。所以假设使用分治法来计算这种问题的话,就会产生许多不必要的重复计算,而动态规划的目标之一就是去除这种重复的计算,而方法就是讲结果放在一张表中,具体的怎么弄可以详细看最长公共子序列问题怎么解的。
动态规划常常用于最优解问题,具体的设计可以参考下面的部分:
1.描述最优解的结构
2.递归定义最优解的值
3.按自底向上的方式计算最优解的值
4.由计算结果构造一个最优解
这几个步骤等等就会被用于求解最长公共子序列的问题上,具体步骤请对号入座。