1、LCS 求最大子序列, 一个办法当然是穷举法了, 但是穷举法太耗时间了O(2^m*2^n), 基本没用.
2、聪明的程序员想到了,一个用矩阵来查找的算法,就是把两个队列用整形矩阵表示, 相同的为1, 不同的为0, 然后求最大对角线,优化是优化了很多, 不过求最大对角线也不省心。
3、聪明的程序员再次优化了算法,就是相同的不是用1表示, 而是数字叠加,这样再找最大对角线的时候,就比较舒服了,时间复杂度也降到了 O(mn)+O(m+n) 如下图:
在画上图的时候碰到了一些问题,自己总结成两条:
1、字符相同,则指向左上,并加1
2、字符不同,则指向左边或者上边较大的那个
即:
F[i][j]=F[i-1][j-1]+1;(a[i]==b[j])
F[i][j]=max(F[i-1][j],F[i][j-1])(a[i]!=b[j]);