💧
[EDPC-N問題 Slimes] Educational DP Contest を Pythonで解く
はじめに
競技プログラミング(使用言語はPython)を日々精進中です。
DP(動的計画法)をマスターするために、AtCoderのEducational DP Contestを解いています。
N問題 Slimes
問題概要
考え方
求める値は
注意するポイントとしては、
DP遷移の考え方は、
こう考えると
一番後ろの区間和の項については、累積和を前計算しておき、高速で計算できるようにしておく。
実装メモ
メモ化再帰関数で実装した。
N = int(input())
A = list(map(int,input().split()))
INF = 10**18
S = [0]
for a in A:
S.append(S[-1]+a)
DP = [[-1]*(N+1) for _ in range(N+1)]
for i in range(N):
DP[i][i+1] = 0
def dp(l,r):
if DP[l][r] >= 0:
return DP[l][r]
ret = INF
for i in range(1,r-l):
ret = min(ret, dp(l,l+i)+dp(l+i,r))
ret += S[r]-S[l]
DP[l][r] = ret
return ret
ans = dp(0,N)
print(ans)
Discussion