最长公共子序列(动态规划算法)
文章目录
一、思路
在寻找最长公共子序列的过程中,我们要构建一个二维数组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]的来源。