N,K=list(map(int,input().split()))

h=list(map(int,input().split()))



#dp[i]はh[i]までにかかるコストの最小値

dp=[float('inf') for _ in range(N)] 

dp[0]=0



for i in range(N-1):

    for j in range(1,min(K+1,N-i)):

        dp[i+j]=min(dp[i+j],dp[i]+abs(h[i+j]-h[i]))

print((dp[N-1]))

import sys

sys.setrecursionlimit(10 ** 5 + 10)

def input(): return sys.stdin.readline().strip()



def resolve():

    

    # https://qiita.com/drken/items/dc53c683d6de8aeacf5a#dp-%E5%AE%9F%E8%A3%85%E3%81%AE%E9%A0%86%E5%BA%8F

    

    

    INF = 10**10  # INF+INFを計算してもオーバーフローしない範囲で大きく

    

    N,K=list(map(int,input().split()))

    h=list(map(int,input().split()))

    # dpテーブル dp[i]:= iに辿りつく最小コスト

    dp = [INF]*N

    """

    初期化の値は，

        最小化問題：INF, 

        最大化問題：-INF（0以上の値しか取らないなら-1, あるいは0でもいいかも)

        数え上げ問題：0

        確率問題：0

        Yes/No判定問題:False

    """

    

    # 初期条件

    dp[0] = 0

    

    # ループ

    for i in range(1,N):

    

        """

        dp[from] の値の更新が完了していればノード from からノード to への緩和を行っていい．貰うdpであれ配るdpであれ．

        両者の違いを意識すべきケースはcf. 

        https://qiita.com/drken/items/ace3142967c4f01d42e9#%E8%B2%B0%E3%81%86-dp-%E3%81%A8%E9%85%8D%E3%82%8B-dp-%E3%81%AE%E6%AF%94%E8%BC%83

    

        # 遷移式がたくさんある場合この中でさらにforループを回したりする cf. https://atcoder.jp/contests/dp/tasks/dp_b

        """

        for j in range(1,K+1):

            if i-j>=0:

                dp[i] = min(dp[i], dp[i-j]+abs(h[i]-h[i-j]))



        

    

    # 出力

    print((dp[N - 1]))

    

    

resolve()
N, K = list(map(int, input().split()))
h = list(map(int, input().split()))
# dp[i]はh[i]までにかかるコストの最小値
dp = [float("inf") for _ in range(N)]
dp[0] = 0
for i in range(N - 1):
    for j in range(1, min(K + 1, N - i)):
        dp[i + j] = min(dp[i + j], dp[i] + abs(h[i + j] - h[i]))
print((dp[N - 1]))

import sys

sys.setrecursionlimit(10**5 + 10)


def input():
    return sys.stdin.readline().strip()


def resolve():
    # https://qiita.com/drken/items/dc53c683d6de8aeacf5a#dp-%E5%AE%9F%E8%A3%85%E3%81%AE%E9%A0%86%E5%BA%8F
    INF = 10**10  # INF+INFを計算してもオーバーフローしない範囲で大きく
    N, K = list(map(int, input().split()))
    h = list(map(int, input().split()))
    # dpテーブル dp[i]:= iに辿りつく最小コスト
    dp = [INF] * N
    """
    初期化の値は，
        最小化問題：INF, 
        最大化問題：-INF（0以上の値しか取らないなら-1, あるいは0でもいいかも)
        数え上げ問題：0
        確率問題：0
        Yes/No判定問題:False
    """
    # 初期条件
    dp[0] = 0
    # ループ
    for i in range(1, N):
        """
        dp[from] の値の更新が完了していればノード from からノード to への緩和を行っていい．貰うdpであれ配るdpであれ．
        両者の違いを意識すべきケースはcf.
        https://qiita.com/drken/items/ace3142967c4f01d42e9#%E8%B2%B0%E3%81%86-dp-%E3%81%A8%E9%85%8D%E3%82%8B-dp-%E3%81%AE%E6%AF%94%E8%BC%83
        # 遷移式がたくさんある場合この中でさらにforループを回したりする cf. https://atcoder.jp/contests/dp/tasks/dp_b
        """
        for j in range(1, K + 1):
            if i - j >= 0:
                dp[i] = min(dp[i], dp[i - j] + abs(h[i] - h[i - j]))
    # 出力
    print((dp[N - 1]))


resolve()

-N, K = list(map(int, input().split())) -h = list(map(int, input().split())) -# dp[i]はh[i]までにかかるコストの最小値 -dp = [float("inf") for _ in range(N)] -dp[0] = 0 -for i in range(N - 1): -    for j in range(1, min(K + 1, N - i)): -        dp[i + j] = min(dp[i + j], dp[i] + abs(h[i + j] - h[i])) -print((dp[N - 1])) +import sys + +sys.setrecursionlimit(10**5 + 10) + + +def input(): +    return sys.stdin.readline().strip() + + +def resolve(): +    # https://qiita.com/drken/items/dc53c683d6de8aeacf5a#dp-%E5%AE%9F%E8%A3%85%E3%81%AE%E9%A0%86%E5%BA%8F +    INF = 10**10  # INF+INFを計算してもオーバーフローしない範囲で大きく +    N, K = list(map(int, input().split())) +    h = list(map(int, input().split())) +    # dpテーブル dp[i]:= iに辿りつく最小コスト +    dp = [INF] * N +    """ +    初期化の値は， +        最小化問題：INF, +        最大化問題：-INF（0以上の値しか取らないなら-1, あるいは0でもいいかも) +        数え上げ問題：0 +        確率問題：0 +        Yes/No判定問題:False +    """ +    # 初期条件 +    dp[0] = 0 +    # ループ +    for i in range(1, N): +        """ +        dp[from] の値の更新が完了していればノード from からノード to への緩和を行っていい．貰うdpであれ配るdpであれ． +        両者の違いを意識すべきケースはcf. +        https://qiita.com/drken/items/ace3142967c4f01d42e9#%E8%B2%B0%E3%81%86-dp-%E3%81%A8%E9%85%8D%E3%82%8B-dp-%E3%81%AE%E6%AF%94%E8%BC%83 +        # 遷移式がたくさんある場合この中でさらにforループを回したりする cf. https://atcoder.jp/contests/dp/tasks/dp_b +        """ +        for j in range(1, K + 1): +            if i - j >= 0: +                dp[i] = min(dp[i], dp[i - j] + abs(h[i] - h[i - j])) +    # 出力 +    print((dp[N - 1])) + + +resolve()