Pagini recente » Cod sursa (job #2003753) | Cod sursa (job #2724468) | Cod sursa (job #2913843) | Cod sursa (job #2202756) | Cod sursa (job #2079982)
#include <cstdio>
#include <algorithm>
#define INF 200000
using namespace std;
int v[10001],s[10001];
int d[1002][10001];
int main()
{
FILE *fin=fopen ("ferma.in","r");
FILE *fout=fopen ("ferma.out","w");
int val,i,j,sol,n,k;
fscanf (fin,"%d%d",&n,&k);
for (i=1;i<=n;i++){
fscanf (fin,"%d",&v[i]);
s[i]=s[i-1]+v[i];
}
for (i=1;i<=k;i++){
val=0;
for (j=1;j<=n;j++){
d[i][j]=max(d[i][j-1],val+s[j]);
val=max(val,d[i-1][j]-s[j]);
// val = suma (pe minus) a elem pe care nu le am luat
}
}
sol=d[k][n]; // asta e sol fara cazul in care ma fol de faptul ca e un cerc
// incerc sa iau si o secv care se termina pe n si una care incepe pe 1
for (i=1;i<=n;i++)
d[1][i]=max(d[1][i-1],s[i]); // e obligatoriu sa iau si ceva de la inceput
for (i=2;i<=k;i++){
val=0;
d[i][1]=v[1]; // trb sa incep cu 1
for (j=2;j<=n;j++){
d[i][j]=max(d[i][j-1],val+s[j]);
val=max(val,d[i-1][j]-s[j]);
}
}
val=0;
for (i=1;i<=n;i++)
val=max(val,d[k][i]-s[i]);
// val e minimul pe care nu il iau in considerare
fprintf (fout,"%d",max(sol,s[n]+val));
return 0;
}