Pagini recente » Cod sursa (job #860377) | Cod sursa (job #2268384) | Cod sursa (job #2500506) | Cod sursa (job #2977530) | Cod sursa (job #526796)
Cod sursa(job #526796)
#include <cstdio>
#include <cassert>
#define N 10010
#define K 1010
template< class T >
inline T maxim(T x,T y) {
return ( (x>y) ? x : y );
}
template< class T >
inline T minim(T x,T y) {
return ( (x<y) ? x : y );
}
int n,k;
int v[N],s[N];
int a[2][K];
int rez = 0;
inline void citire() {
scanf("%d%d",&n,&k);
assert(k<=n);
for(int i=1; i<=n; ++i)
scanf("%d",&v[i]);
s[n] = v[n];
for(int i=n-1; i>0; --i)
s[i] = s[i+1] + v[i];
}
inline void rezolva() {
a[0][1] = maxim(0,v[1]);
a[1][1] = v[1];
for(int i=2; i<=n; ++i) {
if(i<=k) {
a[0][i] = a[1][i-1]+v[i];
a[1][i] = a[0][i];
}
for(int j=minim(i-1,k); j>0; --j) {
a[1][j] = maxim(a[1][j]+v[i],a[0][j-1]+v[i]);
a[0][j] = maxim(a[0][j],a[1][j]);
}
}
rez = maxim(rez,a[0][k]);
a[0][1] = a[1][1] = v[1];
for(int i=2; i<n; ++i) {
if(i<=k) {
a[0][i] = a[1][i-1]+v[i];
a[1][i] = a[0][i];
}
for(int j=minim(i-1,k); j>1; --j) {
a[1][j] = maxim(a[1][j]+v[i],a[0][j-1]+v[i]);
a[0][j] = maxim(a[0][j],a[1][j]);
}
a[1][1] = a[1][1]+v[i];
a[0][1] = maxim(a[0][1],a[1][1]);
if(i>=k && a[0][k]+s[i+1]>rez)
rez = a[0][k]+s[i+1];
}
}
int main() {
freopen("ferma.in","r",stdin);
freopen("ferma.out","w",stdout);
citire();
rezolva();
printf("%d\n",rez);
return 0;
}