// Original C++ solution (slower):
//**KEEP IT SHORT AND SIMPLE**



#include <bits/stdc++.h>

#define IO ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define FILES freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);

#define REP(i,a,b) for (int i = a; i < b; i++)

#define NL '\n'

#define F first

#define S second

using namespace std;

typedef long long ll;

typedef bool bl;

typedef vector < vector<long long> > vvl;

typedef vector <long long> vll;

typedef pair <long long, long long> pll;

typedef set <long long> sll;

typedef map <long long, long long> mll;

typedef map <long long, bool> mlb;

typedef priority_queue<long long, vector<long long>, greater<long long> > minPq;

double pi = 2 * acos(0.0);

int OO = 0x3f3f3f3f;

long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }

long long lcm(long long a, long long b) { return a * (b / gcd(a, b)); }

ll n, k, arr[100010], dp[100010];

ll solve(ll i)

{

    if(i == n - 1)  return 0;

    if(~dp[i])      return dp[i];

    ll ans = OO;

    for(int j = i + 1;j <= min(i + k, n - 1);j++)

        ans = min(solve(j) + abs(arr[j] - arr[i]), ans);

    return dp[i] = ans;

}

int main()

{

    IO

    cin >> n >> k;

    REP(i, 0, n)

        cin >> arr[i];

    memset(dp, -1, sizeof dp);

    cout << solve(0);

    return 0;

}


// Optimized solution to the same problem (faster):
//**KEEP IT SHORT AND SIMPLE**



#include <bits/stdc++.h>

#define IO ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

#define FILES freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);

#define REP(i,a,b) for (int i = a; i < b; i++)

#define NL '\n'

#define F first

#define S second

#define dot(a, b) (conj(a) * (b)).real()

#define cross(a, b) (conj(a)* (b)).imag()

using namespace std;

typedef long long ll;

typedef long double ld;

typedef bool bl;

typedef vector < vector<long long> > vvl;

typedef vector <long long> vll;

typedef pair <long long, long long> pll;

typedef map <long long, long long> mll;

typedef map <long long, bool> mlb;

typedef priority_queue<long long, vector<long long>, greater<long long> > minPq;

typedef tuple<ll, ll, ll> line;

typedef complex<double> point;

const double pi = 2 * acos(0.0);

const int OO = 0x3f3f3f3f;

int main()

{

    IO

    ll n, k;

    cin >> n >> k;

    ll h[n], ans[n];

    REP(i, 0, n)    cin >> h[i];

    ans[0] = 0;

    REP(i, 1, n)

    {

        ll Min = 1e18;

        REP(j, max(i - k, ll(0)), i)

            Min = min(Min, abs(h[j] - h[i]) + ans[j]);

        ans[i] = Min;

    }

    cout << ans[n - 1];

    return 0;

}


// Fastest known solution for this problem:
#include <iostream>

#include <array>

#include <vector>

#include <iomanip>

#include <string>

#include <cmath>

#include <array>

#include <algorithm>

#include <queue>

#include <map>

using namespace std;



typedef  pair<int,int> P;

typedef long long LL;



const LL  INF=1<<31;







int main(){

     int n,k;

     cin>>n>>k;

     int h[100000];

     for(int i=0;i<n;++i){

          cin>>h[i];

     }

     LL dp[100001];



      for(int i=0;i<n;++i){

           dp[i]=INF;

      }

            dp[0]=0;

            dp[1]=abs(h[0]-h[1]);







     for(int i=2;i<n;++i){

          dp[i]=dp[i-1]+abs(h[i-1]-h[i]);

          for(int j=2;j<=k;++j){



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

          }

     }     



     cout<<dp[n-1]<<endl;





}