回覆列表
  • 1 # 小吶不帥但很實在

    、最長公共子序列(Longest Common Subsequence:LCS)

    設有兩個序列A[1...m]和B[1...n],分別對A和B進行劃分子序列

    A[1] A[1..2] A[1..3] ... A[1..m]

    B[1] B[1..2] B[1..3] ... B[1..n]

    依次求出A中的每個子序列(從A[1]開始)與B中每個子序列的最長公共子序列,並記錄在陣列C[m][n]中,C[i][j]表示A[1..i]和B[1..j]的最長公共子序列的長度。

    遞推公式如下:

    ①C[i][j]=0 i=0 or j=0

    ②C[i][j]=C[i-1][j-1]+1 i!=0 and j!=0 and A[i]=B[j]

    路徑記錄:

    記錄路徑即記錄C[i][j]是怎麼得來的,從遞推公式②③知,C[i][j]的來源有三個:C[i-1][j-1],C[i-1][j],C[i][j-1]。如果是從C[i-1][j-1]得來,那麼A[i]=B[j],是最長公共子序列中的一個元素。

    可以設定一個數組P[m][n]來記錄當前的C[i][j]是怎麼得來的,P[m][n]的取值只能有三種,分別記為1 2 3。

    構造最長公共子序列:

    用遞迴的方法,檢查P[i][j],初始i=m,j=n

    如果p[i][j]=1,則記錄C[i][j],然後遞迴處理P[i-1][j-1]

    如果P[i][j]=2,不記錄,遞迴處理P[i-1][j]

    如果P[i][j]=3,不記錄,遞推處理P[i][j-1]

    直到i=0 or j=0

    時間複雜度:O(mn)

  • 中秋節和大豐收的關聯?
  • 真假武則天是怎麼回事?