Pagini recente » Cod sursa (job #2560316) | Cod sursa (job #3142075) | Borderou de evaluare (job #145718) | Cod sursa (job #704273) | Cod sursa (job #2710605)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ferma.in");
ofstream fout("ferma.out");
const int nmax = 10005, inf = 2000000000, kmax = 1005;
int n, k, v[nmax], dp[nmax][kmax][2], dp2[nmax][kmax][2];
int main(){
fin >> n >> k;
for (int i = 1; i <= n; ++i){
fin >> v[i];
dp2[i][0][0] = dp2[i][0][1] = -inf;
}
for (int i = 1; i <= k; ++i){
dp[n + 1][i][0] = dp[n + 1][i][1] = -inf;
dp2[n + 1][i][0] = -inf;
}
for (int index = n; index >= 1; --index){
for (int cnt = 1; cnt <= k; ++cnt){
for (int p = 0; p <= 1; ++p){
if (p){
dp[index][cnt][p] = max(dp[index][cnt - 1][0], v[index] + dp[index + 1][cnt][1]);
dp2[index][cnt][p] = max(dp2[index][cnt - 1][0], v[index] + dp2[index + 1][cnt][1]);
}
else{
dp[index][cnt][p] = max(dp[index + 1][cnt][p], v[index] + dp[index + 1][cnt][1]);
dp2[index][cnt][p] = max(dp2[index + 1][cnt][p], v[index] + dp2[index + 1][cnt][1]);
}
}
}
}
int maxim = dp[1][k][0];
int sum = 0;
for (int i = 1; i < n - k; ++i){
sum += v[i];
maxim = max(maxim, sum + dp2[i + 1][k][0]);
}
if (maxim < 0){
maxim = -1;
}
fout << maxim;
return 0;
}