#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1e5 + 10,K = 110;
int n,k;
int f[N][K][2];
int main()
{
cin >> n >> k;
memset(f,-0x3f,sizeof f);
//初始化
for(int i = 0;i <= n;i++) f[i][0][0] = 0;
for(int i = 1;i <= n;i++)
{
int a;
cin >> a;
for(int j = 1;j <= k;j++)
{
//这是错误的,因为买入加卖出和为一次交易
//f[i][j][0] = max(f[i-1][j][0] , f[i-1][j-1][1] + a);//继续观望 、 卖出
f[i][j][0] = max(f[i-1][j][0] , f[i-1][j][1] + a);//继续观望 、 卖出
//上面右边的操作只是买入还没卖出,所以是同一个操作
f[i][j][1] = max(f[i-1][j][1],f[i-1][j-1][0] - a);// 继续持有、买入
}
}
int res = 0;
for(int i = 0;i <= k;i++)
res = max(res,f[n][i][0]);
cout << res;
return 0;
}