Pagini recente » Cod sursa (job #463610) | Cod sursa (job #778301) | Cod sursa (job #370407) | Cod sursa (job #389051) | Cod sursa (job #973621)
Cod sursa(job #973621)
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;
ifstream fin("ferma.in");
ofstream fout("ferma.out");
const int MAX_N = 10005;
const int MAX_K = 1005;
const int INF = 1 << 30;
int N, K;
int p[MAX_N];
int d[2][MAX_K][2];
void init(bool circ);
void solve(bool circ);
int main() {
fin >> N >> K;
for (int i = 1; i <= N; ++i) {
fin >> p[i];
}
solve(0);
int result = max(d[N & 1][K][0], d[N & 1][K][1]);
solve(1);
result = max(result, d[N & 1][K + 1][1]);
result = max(result, 0);
fout << result;
return 0;
}
void init(bool circ) {
for (int i = 0; i <= K + circ; ++i) {
d[circ][i][0] = d[circ][i][1] = -INF;
}
d[circ][circ][circ] = p[circ];
}
void solve(bool circ) {
init(circ);
for (int ii = 1 + circ; ii <= N; ++ii) {
int i = ii & 1, l = (ii - 1) & 1;
d[i][0][0] = d[l][0][0];
d[i][0][1] = -INF;
for (int j = 1; j <= K + circ; ++j) {
d[i][j][0] = max(d[l][j][0], d[l][j][1]);
d[i][j][1] = max(d[l][j][1], d[l][j - 1][0]) + p[ii];
}
}
}