9251号:LCS
import sys
input = sys.stdin.readline
words = []
for _ in range(2):
words.append(list(map(str,input().rstrip())))
a = len(words[0])
b = len(words[1])
dp = [[0]*(b+1) for _ in range(a+1)]
for i in range(1,a+1):
for j in range(1,b+1):
if words[0][i-1] == words[1][j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j],dp[i][j-1])
print(dp[a][b])
これは動的計画法の最も基本的なものであり、代表的な問題の最長の公共部分数列でもある.まず、rstripを使用してリスト単語の2つの文字列を受け入れます.
次に、2つの単語の文字列長をa,bに入れ、リストdpに(b+1)個の0のリスト(a+1)を作成する.
このようにしてリストを作成する場合、dpリストのリスト要素の0を2つの繰り返し文ですべて共通部分数列に設定できます.
2つの重複文でif文を使用し、単語の0番目のインデックスのi-1と1番目のインデックスのj-1が同じである場合、
dp[i][j] = dp[i-1][j-1] + 1
つまり、前の最高値に+1を加えればいいのです.
Elseはdp[i][j]=max(dp[i][j-1],dp[i-1][j])により値を付与する.
最後の値dp[a][b]を出力すれば、最低価格が得られる.
Reference
この問題について(9251号:LCS), 我々は、より多くの情報をここで見つけました https://velog.io/@mae03087/9251번-LCSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol