Pagini recente » Cod sursa (job #22831) | Cod sursa (job #553592) | Cod sursa (job #273690) | Cod sursa (job #38769) | Cod sursa (job #727544)
Cod sursa(job #727544)
#include<stdio.h>
#define maxn 100005
#define INF (1<<29)
FILE*f=fopen("ferma.in","r");
FILE*g=fopen("ferma.out","w");
int n,k,sol;
int S[maxn],D1[maxn],D2[maxn];
inline int max ( const int &a , const int &b ){
return a >= b ? a : b;
}
inline void dinamica1 () {
int B; D2[0] = -INF;
for ( int j = 1 ; j <= k ; ++j ){
if ( j == 1 ) B = 0;
else B = -INF;
for ( int i = 1 ; i <= n ; ++i ){
D2[i] = max(D2[i-1],B+S[i]);
B = max(B,D1[i]-S[i]);
}
for ( int i = 1 ; i <= n ; ++i ){
D1[i] = D2[i]; D2[i] = 0;
}
}
for ( int i = 1 ; i <= n ; ++i ){
sol = max(sol,D1[i]);
}
}
inline void dinamica2 () {
int B; D2[0] = -INF;
for ( int i = 1 ; i <= n ; ++i ){
D1[i] = max(D1[i-1],S[i]);
}
for ( int j = 2 ; j <= k ; ++j ){
B = -INF;
for ( int i = 1 ; i <= n ; ++i ){
D2[i] = max(D2[i-1],B+S[i]);
B = max(B,D1[i]-S[i]);
}
for ( int i = 1 ; i <= n ; ++i ){
D1[i] = D2[i]; D2[i] = 0;
}
}
for ( int i = 1 ; i < n ; ++i ){
sol = max(sol,D1[i]+S[n]-S[i]);
}
}
int main () {
fscanf(f,"%d %d",&n,&k);
int x;
for ( int i = 1 ; i <= n ; ++i ){
fscanf(f,"%d",&x);
S[i] = S[i-1] + x;
}
dinamica1();
dinamica2();
fprintf(g,"%d\n",sol);
fclose(f);
fclose(g);
return 0;
}