現状
動的計画法の実装を、競技プログラミングの例題を通して勉強しています。
F-LCS
動的計画法の考え方は理解したものの、実際に問題に当てはめるとなるとなかなか方針が立ちません。
上記リンクの問題に動的計画法を無視して考えたコードは以下のようなものです。
Python
1import itertools 2s,t=str(input()),str(input()) 3x=set("".join(x) for i in range(1,len(s)+1) for x in itertools.combinations(s,i)) 4y=set("".join(x) for i in range(1,len(s)+1) for x in itertools.combinations(t,i)) 5z=list(x&y) 6l=list(map(len,z)) 7idx=l.index(max(l)) 8print(z[idx])
一方で、動的計画法による解答例は以下のようなものです。
pypy3
1from subprocess import* 2call(('pypy3','-c',""" 3s=input() 4t=input() 5n,m=len(s),len(t) 6dp=[[0]*(m+1) for i in range(n+1)] 7dp[0][0]=1 8for i in range(n+1): 9 for j in range(m+1): 10 dp[i][j]=max(dp[i][j-1],dp[i-1][j]) 11 if i*j!=0 and s[i-1]==t[j-1]: 12 dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]) 13ans="" 14i,j=n,m 15while 0<i and 0<j: 16 if dp[i][j]==dp[i-1][j]: 17 i-=1 18 elif dp[i][j]==dp[i][j-1]: 19 j-=1 20 else: 21 ans+=s[i-1] 22 i-=1 23 j-=1 24 25print(ans[::-1]) 26"""))
分からないこと
ナップサック問題などでは、何をメモ化しているのかが理解できるのですが、今回の問題ではいまいち理解できません。上記の解答例のコードでは、何をdpに記録して進めているのか教えていただきたく思います。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/02/06 17:03