クラスソリューション: 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]最長共通サブシーケンスであります