Pagini recente » Cod sursa (job #24214) | Cod sursa (job #319695) | Cod sursa (job #3262663) | Cod sursa (job #333169) | Cod sursa (job #80865)
Cod sursa(job #80865)
#include <stdio.h>
#include <string>
#define maxn 10010
#define maxx 1010
int n,m,sol;
int a[maxn],s[maxn];
int c[maxx],best[maxx];
int main()
{
freopen("ferma.in","r",stdin);
freopen("ferma.out","w",stdout);
int i,j;
scanf("%d %d ",&n,&m);
for (i=1;i<=n;i++) scanf("%d ",&a[i]);
for (i=1;i<=n;i++) s[i]=s[i-1]+a[i];
memset(best,-1,sizeof(best));
best[0]=0;
for (i=1;i<=n;i++)
{
for (j=1;j<=m;j++)
if ((best[j-1]!=-1) && (best[j-1]+s[i]>c[j])) c[j]=best[j-1]+s[i];
for (j=0;j<m;j++)
if (c[j]-s[i]>best[j]) best[j]=c[j]-s[i];
}
sol=c[m];
memset(c,0,sizeof(c));
memset(best,-1,sizeof(best));
for (i=1;i<=n;i++)
{
c[i]=s[i];
for (j=2;j<=m;j++)
if ((best[j-1]!=-1) && (best[j-1]+s[i]>c[j])) c[j]=best[j-1]+s[i];
for (j=1;j<m;j++)
if (c[j]-s[i]>best[j]) best[j]=c[j]-s[i];
if (c[m]+s[n]-s[i]>sol) sol=c[m]+s[n]-s[i];
}
printf("%d\n",sol);
return 0;
}