E - Attraction on Rainy Day 解説
by
toam
\(\mathrm{dp}[i][t]\) を「時刻 \(t\) までにアトラクションに \(i\) 回乗り終えたときの,濡れた量の最小値」とします.
dp は次の \(2\) 通りの遷移をたどります.
- 時刻 \(t\) にアトラクションに乗らなかったとき:\(\mathrm{dp}[i][t+1]\leftarrow \mathrm{dp}[i][t]\)
- 時刻 \(t\) から時刻 \(t+T\) までアトラクションに乗ったとき:\(\mathrm{dp}[i+1][t+T]\leftarrow \mathrm{dp}[i][t]+\displaystyle \sum_{j=t}^{t+T-1}P_j\)
\(2\) つ目の遷移について,\(P\) の累積和をあらかじめ計算しておくことで \(O(1)\) で \(\displaystyle \sum_{j=t}^{t+T-1}P_j\) を求めることができます.この dp の状態数は \(O(NK)\) ,遷移は \(O(1)\) となり,時間内に間に合います.
N, K, T = map(int, input().split())
p = list(map(int, input().split()))
cum = [0] * (N + 1)
for i in range(N):
cum[i + 1] = cum[i] + p[i]
inf = 1 << 60
dp = [[inf] * (N + 1) for i in range(K + 1)]
dp[0][0] = 0
for i in range(K + 1):
for t in range(N):
dp[i][t + 1] = min(dp[i][t + 1], dp[i][t])
if i < K and t + T <= N:
dp[i + 1][t + T] = dp[i][t] + cum[t + T] - cum[t]
print(dp[K][N])
投稿日時:
最終更新: