【月曜日】動的計画法について学ぶ②
こんばんわ、syachiです。
今日って一応平日なんですね…。
ということで月曜なので、AtCoderの問題、
動的計画法の学習の続きです。
前回は簡単な問題で解法を試しましたが、
実はもう一通りの解き方があるらしく。
コストの最小値を見える化してリスト化した際、
前回はある一点にたどり着くまでのコストを計算してましたが、
今回は逆に、ある一点からたどり着ける場所のコストを計算する、ということだそうです。
実装例はこちら。
N = int(input())
a = list(map(int, input().split()))
def minVal(minInt, val):
if minInt < val:
return minInt
else:
return val
dp = []
for i in range(N + 5):
dp.append(100000000000000)
dp[0] = 0
for i in range(N):
if (i + 1) < N:
dp[i + 1] = minVal(dp[i + 1], dp[i] + abs(a[i + 1] - a[i]))
if (i + 2) < N:
dp[i + 2] = minVal(dp[i + 2], dp[i] + abs(a[i + 2] - a[i]))
# print(dp)
print(dp[N - 1])
最初の部分のifを書かなくて良い分、
こちらの方が好きかも…。
色々最適化の余地を残しつつ、
時間がないのでこのへんで。