[BOJ/Python]1495番ギタリスト
7067 ワード
この問題はダイナミックプログラミングを用いて解決した.従来のダイナミックプログラミングとは少し異なり,記録を行った.(n+1)*(m+1)のリストを作成し,nで巡回し,1行のリストを巡回する.巡る前にdp[0][s]を1に変換します.次に、繰り返して、ボリュームの可能な位置のすべての要素を1に更新し、dp[-1]リストを表示し、正解が1の最大インデックスを出力します.
点火式は
dp[i-1][j]이 1일 때, dp[i][j+v[i-1]]=1, dp[i][j-v[i-j]]=1
です.->m jのfor文を繰り返す.
-->dp[i-1][j]が0の場合、次の反復が行われる.
-->j+v[i-1]がm以下の場合は、dp[i]j+v[i-1]を1に更新します.
-->j-v[i-1]が0以上の場合は、dp[i]j-v[i-1]を1に更新します.
->dp[1][i]が1の場合、iを出力して重複文を終了します.
Code n, s, m=map(int, input().split())
v=list(map(int, input().split()))
dp=[[0]*(m+1) for _ in range(n+1)]
dp[0][s]=1
for i in range(1, n+1):
for j in range(m+1):
if dp[i-1][j]==0:
continue
if j+v[i-1]<=m:
dp[i][j+v[i-1]]=1
if j-v[i-1]>=0:
dp[i][j-v[i-1]]=1
for i in range(m, -1, -1):
if dp[-1][i]==1:
print(i)
break
else:
print(-1)
Reference
この問題について([BOJ/Python]1495番ギタリスト), 我々は、より多くの情報をここで見つけました
https://velog.io/@xx0hn/BOJ-Python-1495번-기타리스트
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
n, s, m=map(int, input().split())
v=list(map(int, input().split()))
dp=[[0]*(m+1) for _ in range(n+1)]
dp[0][s]=1
for i in range(1, n+1):
for j in range(m+1):
if dp[i-1][j]==0:
continue
if j+v[i-1]<=m:
dp[i][j+v[i-1]]=1
if j-v[i-1]>=0:
dp[i][j-v[i-1]]=1
for i in range(m, -1, -1):
if dp[-1][i]==1:
print(i)
break
else:
print(-1)
Reference
この問題について([BOJ/Python]1495番ギタリスト), 我々は、より多くの情報をここで見つけました https://velog.io/@xx0hn/BOJ-Python-1495번-기타리스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol