#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int,int> P;
typedef map<int,int> M;
typedef vector<int> V;
#define INF (int)(1e9)
#define MAXX 999999
#define EPS (1e-7)
#define MOD ((ll)1e9+7)
#define rep(i,n) for(int i=0; i<(int)(n);i++)
#define REP(i,n) for(int i=1;i<=(int)(n);i++)
#define FOR(i,k,n) for(int i=(k);i<(int)(n);i++)
#define ALL(a)  a.begin(),a.end()
#define RALL(a) a.begin(),a.end(),greater<int>()
#define ROT(a) a.begin(),a.begin()+1,a.end()
#define RROT(a) a.begin(),a.end()-1,a.end()
#define PB push_back
#define MP make_pair
#define PI acos(-1.0)
/*--------------------------------------------*/
/*
int dx[4]={-1,0,1,0};//四方に移動
int dy[4]={0,-1,0,1};
*/
/*--------------------------------------------*/
/*--------------------------------------------*/
/*
ll factorial(ll n){
    if(n==1)return 1;
    return n*factorial(n-1);
}
//
ll memo[MAXX];
ll factorial_memo(long int n){
    if(memo[n]!=0)return memo[n];
    if(n==1)return memo[n]=1;
    return memo[n]=n*factorial_memo(n-1);
}
//
ll lcm(ll A, ll B) {//最小公倍数
    ll a=A;
    ll b=B;
    if (a==0 || b==0) {return 0;}
    if (a<0) {a=-a;}
    if (b<0) {b=-b;}
    while(b>0) {
        ll c=a%b;
        a=b;
        b=c;
    }
    return A/a*B;
}

ll gcd(ll a,ll b){
    while(b!=0) {
        int t=b;
        b=a%b;
        a=t;
    }
    return a;
}

//入力はすべて正とする
bool is_prime(int n) {//素数判定o(√n)
    for (int i=2;i*i<=n;i++){
        if(n%i==0)return false;
    }
    return n!=1;//1の場合は例外
}

vector<ll> divisor(ll n){//約数の列挙o(√n)
    vector<ll> res;
    for(ll i=1;i*i<=n;i++) {
        if(n%i == 0){
        res.push_back(i);
        if(i!=n/i)res.push_back(n/i);
        }
    }
    return res;
}//vector<ll>k=divisor(n);rep(i,k.size())cout<<k[i]<<endl;//のように使う

map<ll,ll> prime_factor(ll n){//素因数分解o(√n)
    map<ll,ll>res;    
    for(ll i=2;i*i<=n;i++) {
        while (n%i==0) { 
            ++res[i];
            n/=i;
        }
    }
    if (n!=1)res[n]=1;
    return res;
}//map<ll,ll> k=prime_factor(n);for(auto i=k.begin();i!=k.end();i++){cout<<i->first<<" "<<i->second<<endl;}//みたいに使う

vector<ll> prime_list(ll n){//n以下の素数を全て見つける
    vector<ll> is_prime(n);//is_prime[i]が1ならiは素数
    for(ll i=2;i<=n;i++)is_prime[i]=1;//最初はみんな素数かも
    for(ll i=2;i*i<=n;i++){//素数の整数倍を消していく(√nまで)
        if(is_prime[i]){
            for(ll j=2*i;j<=n;j++){
                if(j%i==0){
                    is_prime[j]=0;                
                }
            }
        }
    }return is_prime;
}//vector<ll>k=prime_list(n);REP(i,n){if(k[i])cout<<i<<endl;}のように使う
*/
/*--------------------------------------------*/
/*int memo[MAXX];
int fib1(int n){//メモ化再帰
    if(memo[n]!=0)return memo[n];//求値済みなら再利用
    if(n<=1)return n;//終了条件
    memo[n]=fib1(n-1)+fib1(n-2);//終了でないなら再帰式
    return memo[n];
}*/

/*int dp[MAXX];
int fib2(int n){//Dynamic Pragramming
    dp[0]=0;dp[1]=1;//初期化
    //漸化式を作ってDP
    for(int i=2;i<=n;i++){//簡単なほうから複雑なほうに進んでいく
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}*/
/*--------------------------------------------*/

int main(){
    //初DP行くぞ!
    int n,k;cin>>n>>k;
    V h(n);rep(i,n)cin>>h[i];
    int dp[MAXX];
    rep(i,n)dp[i]=INF;
    dp[0]=0;
    REP(i,n-1){//1<=i<n;
        REP(j,k){
            if(j>i&&i<k)continue;//i=1->j=1つまり,一段飛ばししかだめ.
                                 //i=2->j=1or2;
                                   //:::
                                 //i=k-1->j=1or2or...ork-1;
            dp[i]=min(dp[i],dp[i-j]+abs(h[i]-h[i-j]));
        }
    }
    int ans=dp[n-1];
    cout<<ans<<endl;
}




Measured memory_bytes: 3072