問題
回答
動的計画法を使って解く。
TLEで間に合わなかった回答
in, k = map(int, input().split()) h = [int(i) for i in input().split()] # dpの最小値を変更する関数 def chmin(a, b): if a > b: return b else: return a # 無限大の値 f_inf = float('inf') # DP テーブルを初期化 (最小化問題なので INF に初期化) dp = [f_inf] * (10**5+10) # 初期条件 dp[0] = 0 for i in range(1, n): for j in range(1, k+1): if i - j >= 0: dp[i] = chmin(dp[i], dp[i-j]+ abs(h[i] - h[i - j])) print(dp[n-1])
他のコードを参考にすると、dpの更新は、forでループを回すのではなく、numpyの行列またはリスト内包表記を使うことで、まとめて計算をすることで、時間を短縮しているようです。
また、以下の記事を参考にして、inputの方法を変更しました。
numpyを使った回答
import sys import numpy as np # inputを高速化する。 input = sys.stdin.readline n, k = map(int, input().split()) h = [int(i) for i in input().split()] # dpの配列を作る。 dp = np.zeros(n, dtype=int) # hの配列を作る。 h = np.array(h) for i in range(1, n): # start は負になることはない。 start = max(0, i-k) # 行列として足し算できるのでforを使う必要がない。 dp[i] = min(dp[start: i] + np.abs(h[i] - h[start: i])) print(dp[n-1])