#include <iostream>
using namespace std;
int main() {
int prices[1001]; // 存储价格的数组
int dp[1001][202]; // 动态规划数组
int n, k; // n 表示天数,k 表示最多交易次数
// 输入天数和最多交易次数
cin >> n >> k;
// 输入每一天的价格
for(int i = 1; i <= n; i++) {
cin >> prices[i];
}
dp[1][0] = 0; // 第一天不进行任何交易的利润为0
// 初始化第一天的动态规划数组
for(int i = 1; i <= 100; i++) {
dp[1][2 * i - 1] = -prices[1]; // 第一次买入后的状态
dp[1][2 * i] = 0; // 不进行任何交易的状态
}
// 从第二天开始进行动态规划
for(int i = 2; i <= n; i++) {
dp[i][0] = 0; // 第0次交易的利润为0
// 遍历每一次可能的交易次数
for(int j = 1; j <= k; j++) {
// 第j次买入后的最大利润
dp[i][2 * j - 1] = max(dp[i - 1][2 * j - 1], dp[i - 1][2 * j - 2] - prices[i]);
// 第j次卖出后的最大利润
dp[i][2 * j] = max(dp[i - 1][2 * j], dp[i - 1][2 * j - 1] + prices[i]);
}
}
// 输出在n天内最多进行k次交易的最大利润
cout << dp[n][2 * k] << endl;
return 0;
}
// 64 位输出请用 printf("%lld")