#include<bits/stdc++.h>
using namespace std;
// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;
#define fio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define ll long long int
#define ull unsigned long long int  // ranges from (0 - twice of long long int)
#define rep(i,a,n) for (ll i=a;i<n;i++)
#define per(i,a,n) for (ll i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define vll vector<ll>
#define mod 1000000007LL
#define llpair pair<ll,ll>
#define INF 1000000000000000000ll
#define np next_permutation
#define PI acos(-1)
#define deb(x) cout<<#x<<" "<<x<<endl;
#define np next_permutation
//ALWAYS USE ll DATA TYPE FOR INTEGER(FASTER THAN INTEGER AS WELL AS SOMETIMES WITHOUT USE LONG UR ANSWER WILL NOT ACCEPTED) && DOUBLE FOR DECIMAL VALUE
template<typename T> // for removing front element from the vector
void pop_front(std::vector<T> &v)
{
    if (v.size() > 0) {
        v.erase(v.begin());
    }
}
template<typename R> // for removing back element from the vector or can directly
void pop_back(std::vector<R> &v) // use vec.pop_back() function...
{
    if (v.size() > 0) {
        v.erase(v.begin()+v.size()-1);
    }
}

bool isprime(ll n)  //IN  O(sqrt(n))
{
    if(n<=1) return false;
    for(ll i=2;i*i<=n;i++)
        if(n%i==0)
            return false;

    return true;
}

vector<ll> factors(ll n){    //IN  O(sqrt(n))

    vll v;
    for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            v.pb(i);
            if((n/i)!=i)
            v.pb(n/i);
        }
    }
    return v;
}

ll power(ll a, ll n)  // using Binary Exponential in TC O(logn)
{                     // Self Written By </ME> :)
    ll res=1;
    while(a)
    {
    	if(n%2)
    	{
    		res=res*a; n--;
		}
		else
		{
			n=n/2; a=a*a;
		}
	}
	
	return res;
}

ll ts(ll arr[],int l,int r,int x) // ternary search to find x in sorted array arr
{
    
    while(l<=r)
    {
        ll mid1= l+(r-l)/3;
        ll mid2= r -(r-l)/3;
        if(arr[mid1]==x || arr[mid2]==x)
            return 1;
        if(x<arr[mid1])
            r=mid1-1;
        else if(x>arr[mid2])
            l=mid2+1;
        else
        {
            l=mid1+1;
            r=mid2-1;
        }
    }

    return -1;
}


ll kadane(ll arr[],ll n)
{
	ll mover=arr[0],saver=arr[0];
	for(ll i=1;i<n;i++)
	{
		mover=max(mover+arr[i],arr[i]);
		saver=max(saver,mover);
	}
	
	return saver;
}

// ############# DISJOINT SET FUNCTIONS ##############
/*
ll find(ll a) // work always is to return the parent of the set nothing itn has to do
{ // In set you can't join one element to another element or linked any element to other element except
    // the parent node, it means only parent Node Can Be Edditable In A SET
    if(arr[a]<0)
        return a;
    else
    {
        ll x= find(arr[a]);
        arr[a]=x;
        return x;
    }   



}

void uni(ll a, ll b)
{
    arr[a]= min(arr[a],arr[b]);
    arr[b]=a;
}

*/
#define INF 1e9+5

int main() {
    auto start = chrono::high_resolution_clock::now();
    fio;
    ll t=1; 
	//cin>>t;
    while(t--)
    {
	ll n,k; cin>>n>>k;
	ll arr[n+1]; rep(i,1,n+1)cin>>arr[i];
	ll dp[n+1]; memset(dp,INF,sizeof(dp));
	dp[1]=0;
	dp[2]=abs(arr[2]-arr[1]);
	for(int i=3;i<=n;i++)
	{
		for(int j=1;j<=k;j++)
		{
			if(i-j>=0)
			dp[i]=min(dp[i-j]+abs(arr[i]-arr[i-j]),dp[i]);
		}
	}
	//dp[i]=min(dp[i-1]+abs(arr[i]-arr[i-1]),dp[i-2]+abs(arr[i]-arr[i-2]));
	
	cout<<dp[n]<<"\n";
	}
	
    auto finish = chrono::high_resolution_clock::now();
    cerr << "Time elapsed: " << (chrono::duration<long double>(finish-start)).count() << "s\n";
    return 0;
}


Measured memory_bytes: 1792