Pagini recente » Cod sursa (job #384688) | Cod sursa (job #828164)
Cod sursa(job #828164)
#include <cstdio>
#include <algorithm>
#include <cassert>
using namespace std;
const int MaxN = 10005;
const int MaxK = 1005;
int N, K, Sum[MaxN];
int DP[MaxK][MaxN], Solution;
void SolveDP(int Start) {
for (int i = Start; i <= K; ++i) {
for (int j = 1, MaxDP = 0; j <= N; ++j) {
DP[i][j] = max(DP[i][j - 1], Sum[j] + MaxDP);
MaxDP = max(MaxDP, DP[i - 1][j] - Sum[j]);
}
}
}
void Solve() {
SolveDP(1);
Solution = DP[K][N];
for (int i = 1; i <= N; ++i)
DP[1][i] = max(DP[1][i - 1], Sum[i]);
for (int i = 1; i <= K; ++i)
DP[i][1] = Sum[1];
SolveDP(2);
for (int i = 1; i <= N; ++i)
Solution = max(Solution, DP[K][i] + Sum[N] - Sum[i]);
}
void Read() {
assert(freopen("ferma.in", "r", stdin));
assert(scanf("%d %d", &N, &K) == 2);
for (int i = 1; i <= N; ++i) {
int Value; assert(scanf("%d", &Value) == 1);
Sum[i] = Sum[i - 1] + Value;
}
}
void Print() {
assert(freopen("ferma.out", "w", stdout));
printf("%d\n", Solution);
}
int main() {
Read();
Solve();
Print();
return 0;
}