Pagini recente » Cod sursa (job #2227101) | Cod sursa (job #996620) | Cod sursa (job #676594) | Cod sursa (job #957444) | Cod sursa (job #1620168)
#include <iostream>
#include <fstream>
#include <cstring>
#define inf 0x3f3f3f
using namespace std;
ifstream f("ferma.in");
ofstream g("ferma.out");
int n,mn,l1,l2,a[10005],s[10005],dp[10005][2],mx[10005][2],dr[10005],sol=-2147000000;
void CalcSums()
{ int i,sum;
sum=0;
for(i=n;i>=1;i--)
{ sum+=a[i];
dr[i]=sum;
}
}
void Dinamica(int k)
{ int i,j;
for(j=2;j<=k;j++)
{ l1^=1; l2^=1;
for(i=j;i<=n;i++)
{ dp[i][l2]=s[i]+mx[i-1][l1];
if (i>j)
dp[i][l2]=max(dp[i][l2],dp[i-1][l2]);
if (i==j)
mx[i][l2]=dp[i][l2]-s[i];
else
mx[i][l2]=max(mx[i-1][l2],dp[i][l2]-s[i]);
}
}
}
int main()
{ int i,j,k,ind=1;
f>>n>>k;
mn=0;
l1=0; l2=1;
for(i=1;i<=n;i++)
{f>>a[i];
s[i]=s[i-1]+a[i];
dp[i][l2]=s[i]-mn;
if (i>1) dp[i][l2]=max(dp[i][l2],dp[i-1][l2]);
if (i==1)
mx[i][l2]=dp[i][l2]-s[i];
else
mx[i][l2]=max(dp[i][l2]-s[i],mx[i-1][l2]);
if (s[i]<=mn) mn=s[i];
}
Dinamica(k);
for(i=k;i<=n;i++)
sol=max(sol,dp[i][l2]);
l1=0; l2=1;
for(i=1;i<=n;i++)
{ dp[i][l2]=s[i];
if (i>1) dp[i][l2]=max(dp[i][l2],dp[i-1][l2]);
if (i==1) mx[i][l2]=dp[i][l2]-s[i];
else mx[i][l2]=max(mx[i][l2],mx[i-1][l2]);
}
Dinamica(k);
CalcSums();
for(i=k;i<=n;i++)
sol=max(sol,dp[i][l2]+dr[i+1]);
if (sol<0) g<<"0\n"; else g<<sol;
return 0;
}