最长上升公共子序列
- 最长公共子序列(longest common sequence):
- 当a(x)≠b(y) 时,f(x,y)=max(f(x−1,y),f(x,y))
- 否则:f(x,y)=f(x−1,y−1)+1
- 最长上升子序列(longest increasing sequence):
- 对于a(i)<a(k) ,i=1,2,…,k−1时,有f(k)=max(1,f(i)+1)
- 否则f(k)=max(f(k),1)
最长上升公共子序列(LICS):参考LIS,即考虑前面元素的大小情况,参考LCS,考虑子序列的结尾。
- f(i,j):只在a序列的前i部分,b序列的前j部分,且以b[j]结尾的LICS的集合。
- 当a(i)=b(j),对任意k=0,1,,,j−1,当b(k)<b(j)=a(i),有f(i,j)=max(f(i,j),f(i−1,k)+1),否则f(i,j)=max(f(i,j),1)。
- 上一条第i层j列的结果,依赖于第i−1层j列之前的所有位置上f值的最大值加1,因此可以记录该最大值,当然条件时b(k)<a(i)。
- 当a(i)≠b(j)时, f(i,j)=f(i−1,j)。
组合数
Cba=a!b!(a−b)!性质:已经选了某一个,剩下a−1个里面选b−1个;没选这某一个,剩下a−1 里选 b 个。
- Cba=Cba−1+Cb−1a−1
正则表达式匹配
dp[ i ] [ j ]表示的是 s[0 ~ i] 与 p[0 ~ j] 是否匹配;
p[ j ] != ‘*’ 时 ,
dp[ i ] [ j ] = dp[ i - 1] [ j - 1] AND (p[ j ] == '.' OR p[ j ] == s[ i ])
p[ j ] == ‘‘时,按照 的重复次数0,1,…,k。有:
还有:
dp(i−1,j)=dp(i−1,j−2)\or(dp(i−2,j−2)\and(pj−1==si−1))\or...由公式:
(a\andb)\or(b\andc)=(a\orc)\andb得:
dp(i,j)=dp(i,j−2)\or(dp(i−1,j)\and(pj−1==si))1 | class Solution(object): |
Related Issues not found
Please contact @zhengchu1994 to initialize the comment