import std.stdio;
import std.string;
import std.format;
import std.conv;
import std.typecons;
import std.algorithm;
import std.functional;
import std.bigint;
import std.numeric;
import std.array;
import std.math;
import std.range;
import std.container;
import std.concurrency;
import std.traits;
import std.uni;
import core.bitop : popcnt;

alias Generator = std.concurrency.Generator;

enum long INF = long.max / 5;
enum long MOD = 10L ^^ 9 + 7;

void main()
{
  long N, K;
  scanln(N, K);
  long[] hs = readln.split.to!(long[]);
  hs = [0L] ~ hs ~ [0L];

  long[][] dp = new long[][](N+1+1, K+1);
  foreach(i; 0..N+1+1) foreach(j; 0..K+1) {
    dp[i][j] = INF;
  }
  dp[0][0] = 0;

  foreach(i; 0..N+1+1) {
    foreach(j; 0..K+1) {
      foreach(k; 0..K+1) {
        if (j+k > K) break;
        if (i+k+1 > N+1) break;
        dp[i+k+1][j+k].ch!min(dp[i][j] + max(0, hs[i+k+1] - hs[i]));
      }
    }
  }

  dp[N+1].reduce!min.writeln;
}

// ----------------------------------------------

void times(alias fun)(long n)
{
  // n.iota.each!(i => fun());
  foreach (i; 0 .. n)
    fun();
}

auto rep(alias fun, T = typeof(fun()))(long n)
{
  // return n.iota.map!(i => fun()).array;
  T[] res = new T[n];
  foreach (ref e; res)
    e = fun();
  return res;
}

T ceil(T)(T x, T y) if (isIntegral!T || is(T == BigInt))
{
  // `(x+y-1)/y` will only work for positive numbers ...
  T t = x / y;
  if (t * y < x)
    t++;
  return t;
}

T floor(T)(T x, T y) if (isIntegral!T || is(T == BigInt))
{
  T t = x / y;
  if (t * y > x)
    t--;
  return t;
}

ref T ch(alias fun, T, S...)(ref T lhs, S rhs)
{
  return lhs = fun(lhs, rhs);
}

unittest
{
  long x = 1000;
  x.ch!min(2000);
  assert(x == 1000);
  x.ch!min(3, 2, 1);
  assert(x == 1);
  x.ch!max(100).ch!min(1000); // clamp
  assert(x == 100);
  x.ch!max(0).ch!min(10); // clamp
  assert(x == 10);
}

mixin template Constructor()
{
  import std.traits : FieldNameTuple;

  this(Args...)(Args args)
  {
    // static foreach(i, v; args) {
    foreach (i, v; args)
    {
      mixin("this." ~ FieldNameTuple!(typeof(this))[i]) = v;
    }
  }
}

void scanln(Args...)(auto ref Args args)
{
  enum sep = " ";
  enum n = Args.length;
  enum fmt = n.rep!(() => "%s").join(sep) ~ "\n";
  static if (__VERSION__ >= 2071)
  {
    readf!fmt(args);
  }
  else
  {
    enum argsTemp = n.iota.map!(i => "&args[%d]".format(i)).join(", ");
    mixin("readf(fmt, " ~ argsTemp ~ ");");
  }
}

// fold was added in D 2.071.0
static if (__VERSION__ < 2071)
{
  template fold(fun...) if (fun.length >= 1)
  {
    auto fold(R, S...)(R r, S seed)
    {
      static if (S.length < 2)
      {
        return reduce!fun(seed, r);
      }
      else
      {
        return reduce!fun(tuple(seed), r);
      }
    }
  }
}

// popcnt with ulongs was added in D 2.071.0
static if (__VERSION__ < 2071)
{
  ulong popcnt(ulong x)
  {
    x = (x & 0x5555555555555555L) + (x >> 1 & 0x5555555555555555L);
    x = (x & 0x3333333333333333L) + (x >> 2 & 0x3333333333333333L);
    x = (x & 0x0f0f0f0f0f0f0f0fL) + (x >> 4 & 0x0f0f0f0f0f0f0f0fL);
    x = (x & 0x00ff00ff00ff00ffL) + (x >> 8 & 0x00ff00ff00ff00ffL);
    x = (x & 0x0000ffff0000ffffL) + (x >> 16 & 0x0000ffff0000ffffL);
    x = (x & 0x00000000ffffffffL) + (x >> 32 & 0x00000000ffffffffL);
    return x;
  }
}


Measured memory_bytes: 3196