python 動的計画法 part1

Atcorder始めたけれどなかなかC問題解けるようにならないので

ここで学んだことをまとめていく。

D問題で動的計画法が使われてる。

わかりやすそうなサイト。

まずはA.カエルのお話

 #足場の数とそれぞれの高さを受け取る 
N = int(input())
H = list(map(int, input(). split()))
 #動的計画法 
 #DPテーブルを設定 
dp = [float('inf') for _ in range(N)]
 #初期条件 
dp[0] = 0
 #ループ 
for i in range(1,N):
   dp[i] = min(dp[i], dp[i-1] + abs(H[i] - H[i-1]))
   if i > 1:
       dp[i] = min(dp[i],dp[i-2] + abs(H[i] - H[i-2]))

ans = dp[-1]
print(ans)

ループで書くのは直感的で理解しやすい。

再帰関数を使うやり方はとても難しい。できる人すごいな。

import sys
sys.setrecursionlimit(1000000000)

n = int(input())
h = list(map(int, input(). split()))
dp = [0]*n
check = [False]*n

def cost(i):
   if check[i]:
       return dp[i]
   else:
       #初期設定
       if i == 0:
           dp[i] = 0
       #i-1,i-2
       elif i == 1:
           dp[i] = abs(h[1] - h[0])
       elif i > 1:
           dp[i] = min(cost(i-1) + abs(h[i] - h[i-1]), cost(i-2) + abs(h[i] - h[i-2]))
       check[i] = True
       return dp[i]

print(cost(n-1))

どうやら再帰の数が多いとエラーが発生するらしい。それを抑えるのが最初の二行。

まとめ

動的計画法の基礎を学んだ。


この記事が気に入ったらサポートをしてみませんか?