DP最長共通部分列

クラスソリューション:
     DEF LCS(セルフ、A、B):
         IF  ていない A または ません:B                                   #1 境界処理
            リターン0 
        DP = [0 ため _ 範囲(LEN(B)+ +1)] のための _ 範囲(LEN( A)+ +1)] #の状態の定義、DP [i] [j]は最長共通の現在の長さ意味
         I における(A)+ +1)lenを、範囲(1:                          #1 トラバーサルシーケンス
             J 。範囲(1、 LEN(B)+ +1):                     トラバーサルシーケンスB、時間複雑度はN2である
                IF[-I 1] == B [-J 1]:                         二つの値が等しい場合、このときの 
                    DP [I] [J] DP = [1-I]、[J-1] + 1つの              #の状態遷移はプレ時間状態プラス1。
                #は、等しくない次いで、 
                    DP [I] [J] = MAX(DP [I]、[J-1]、DP [I-1] [J])   最初の二つの現在時の状態、時間の値が大きいほど
        印刷(B)
        self.printDP(DP)
        を返す [ - 1] DP [-1]を                                    最適解は、最後の状態値である
    DEF:printDP(自己、DP)                                   印刷過渡
         I レンジ(LEN(DP))
             のために J範囲(LEN(DP [I])):
                 印刷(DP [I] [J]、エンド= '  ' を印刷()

IF  __name__ == ' __main__ ' 
    ソリューション = ソリューション()
    A。= [1、2、 3 ,. 5,2 ,. 1 ] 
    B = [3,2 ,. 1 ,. 4 ,. 7 ] 
    RESの = solution.LCS(A、B)
     を印刷' 最長共通部分列の長さ:'、RES)

結果は以下の通りである:[3,2,1]最長共通サブシーケンスであります

 

おすすめ

転載: www.cnblogs.com/missidiot/p/11505044.html