Buggy python submission (verdict: Time Limit Exceeded):
#----グローバル変数----
INF = 10**10 #無限大（最小化問題の場合）
dp=[]       #DPテーブル

h=[]   #足場の高さ
#----------------------

#----関数----

#DPテーブル更新関数　最小化用＆最大化用
def chmin(dp, idx, new_val):
    if dp[idx] > new_val:
        dp[idx] = new_val
        return True
    return False

def chmax(dp, idx, new_val):
    if dp[idx] < new_val:
        dp[idx] = new_val
        return True
    return False
#------------


#----実行開始----
# 入力
n,k = map(int, input().split())

s = input()
h = [int(x) for x in s.split()]

# DPテーブル初期化 (最小化問題なので INF に初期化)
for i in range(n+k-1):
    dp.append(INF)

#配るタイプなので、hをk-1分延長しておく
for i in range(k-1):
    h.append(0)

# 初期条件
dp[0] = 0;

# ジャンプのループ
for i in range(0,n-1):
    for j in range(1,k+1):
        # jp check    
        jpcost = abs(h[i]-h[i+j])
        chmin(dp,i+j,dp[i]+jpcost)

# 出力
print(dp[n-1])

#---------------


Fixed submission:
#----グローバル変数----
INF = 10**10 #無限大（最小化問題の場合）
dp=[]       #DPテーブル

h=[]   #足場の高さ
#----------------------

#----関数----

#DPテーブル更新関数　最小化用＆最大化用
def chmin(dp, idx, new_val):
    if dp[idx] > new_val:
        dp[idx] = new_val
        return True
    return False

def chmax(dp, idx, new_val):
    if dp[idx] < new_val:
        dp[idx] = new_val
        return True
    return False
#------------


#----実行開始----
# 入力
n,k = map(int, input().split())

s = input()
h = [int(x) for x in s.split()]

# DPテーブル初期化 (最小化問題なので INF に初期化)
for i in range(n):
    dp.append(INF)

# 初期条件
dp[0] = 0;

# ジャンプのループ
for i in range(1,n):
    farthest = max(0,i-k)
    for j in range(farthest,i):
        # jp check    
        jpcost = abs(h[j]-h[i])
        chmin(dp,i,dp[j]+jpcost)

# 出力
print(dp[n-1])

#---------------

Buggy python submission (verdict: Time Limit Exceeded):
#----グローバル変数----
INF = 10**10 #無限大（最小化問題の場合）
dp=[]       #DPテーブル

h=[]   #足場の高さ
#----------------------

#----関数----

#DPテーブル更新関数　最小化用＆最大化用
def chmin(dp, idx, new_val):
    if dp[idx] > new_val:
        dp[idx] = new_val
        return True
    return False

def chmax(dp, idx, new_val):
    if dp[idx] < new_val:
        dp[idx] = new_val
        return True
    return False
#------------


#----実行開始----
# 入力
n,k = map(int, input().split())

s = input()
h = [int(x) for x in s.split()]

# DPテーブル初期化 (最小化問題なので INF に初期化)
for i in range(n):
    dp.append(INF)

# 初期条件
dp[0] = 0;

# ジャンプのループ
for i in range(1,n):
    farthest = max(0,i-k)
    for j in range(farthest,i):
        # jp check    
        jpcost = abs(h[j]-h[i])
        chmin(dp,i,dp[j]+jpcost)

# 出力
print(dp[n-1])

#---------------


Fixed submission:
#----グローバル変数----
INF = 10**10 #無限大（最小化問題の場合）
dp=[]       #DPテーブル

h=[]   #足場の高さ
#----------------------

#----関数----

#DPテーブル更新関数　最小化用＆最大化用
def chmin(dp, idx, new_val):
    if dp[idx] > new_val:
        dp[idx] = new_val
        return True
    return False

def chmax(dp, idx, new_val):
    if dp[idx] < new_val:
        dp[idx] = new_val
        return True
    return False
#------------


#----実行開始----
# 入力
n,k = map(int, input().split())

s = input()
h = [int(x) for x in s.split()]

# DPテーブル初期化 (最小化問題なので INF に初期化)
for i in range(n):
    dp.append(INF)

# 初期条件
dp[0] = 0;

# ジャンプのループ
for i in range(1,n):
    farthest = max(0,i-k)
    for j in range(farthest,i):
        # jp check    
        jpcost = abs(h[j]-h[i])
        chmin(dp,i,dp[j]+jpcost)

# 出力
print(dp[n-1])

#---------------