Pagini recente » Monitorul de evaluare | Cod sursa (job #2553544) | Monitorul de evaluare | Profil RaresPoinaru | Cod sursa (job #1297866)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 10010, KMAX = 1010, INF = 0x3f3f3f3f;
int N, K, V[NMAX], S[NMAX], Dp[KMAX][NMAX], Ans;
void DP(int Start)
{
for(int i = Start; i <= K; ++ i)
{
int Max = 0;
Dp[i][0] = -INF;
for(int j = 1; j <= N; ++ j)
{
if(j < i) Dp[i][j] = -INF;
else Dp[i][j] = max(Dp[i][j - 1], S[j] + Max);
Max = max(Max, Dp[i - 1][j] - S[j]);
}
}
}
int main()
{
freopen("ferma.in", "r", stdin);
freopen("ferma.out", "w", stdout);
scanf("%i %i", &N, &K);
for(int i = 1; i <= N; ++ i) scanf("%i", &V[i]), S[i] = S[i - 1] + V[i];
DP(1);
Ans = Dp[K][N];
for(int i = 1; i <= N; ++ i)
Dp[1][i] = max(Dp[1][i - 1], S[i]);
DP(2);
for(int i = 1; i <= N; ++ i)
Ans = max(Ans, Dp[K][i] + S[N] - S[i]);
printf("%i\n", max(Ans, 0));
}