Pagini recente » Cod sursa (job #304190) | Cod sursa (job #1113086) | Cod sursa (job #1655889) | Cod sursa (job #2906112) | Cod sursa (job #1069786)
#include <fstream>
#include <cstring>
#include <algorithm>
#define maxn 10010
#define maxk 1010
using namespace std;
ifstream fin("ferma.in");
ofstream fout("ferma.out");
int a[maxn];
int v[maxn];
int dp[2][maxn],ok;
int s,n,k,current,ans,nr,currents,t,maxv;
int main()
{
fin>>n>>k;
for (int i=1; i<=n; ++i)
{
fin>>a[i];
if (a[i] > 0)
{
++nr;
}
}
if (nr <= k)
{
nth_element (a+1,a+n-k+1,a+n+1);
int p = a[n-k+1];
for (int i=1; i<=n; ++i)
{
if (a[i] > p)
{
s += a[i];
--k;
}
}
while (k)
{
s += p;
--k;
}
if (s > 0)
fout<<s;
else fout<<0;
return 0;
}
for (int i=1; i<=n; ++i)
{
if ((a[i] >= 0) == (currents >= 0) )
{
currents += a[i];
}
else
{
++t;
if (currents >= 0)
{
v[t] = -currents;
s += currents;
}
else v[t] = currents;
currents = a[i];
}
}
if ( (currents >= 0) == (a[1] >= 0) )
{
if (currents >= 0)
{
v[1] -= currents;
s += currents;
}
else v[1] += currents;
}
else
{
++t;
if (currents >= 0)
{
v[t] = -currents;
s += currents;
}
else v[t] = currents;
}
k = t/2-k;
if (k <= 0)
{
fout<<s;
return 0;
}
for (int i=1; i<=k; ++i, ok = 1-ok)
{
dp[ok][i] = dp[1-ok][i-1]+v[i];
for (int j=i+1; j<t; ++j)
{
dp[ok][j] = max (dp[ok][j-1],dp[1-ok][j-2]+v[j]);
}
}
maxv = dp[1-ok][t-1];
ok = 0;
memset (dp,0,sizeof(dp));
for (int i=1; i<=k; ++i, ok = 1-ok)
{
dp[ok][i+1] = dp[1-ok][i] + v[i+1];
for (int j=i+2; j<=t; ++j)
{
dp[ok][j] = max (dp[ok][j-1],dp[1-ok][j-2]+v[j]);
}
}
maxv = max (maxv,dp[1-ok][t]);
if (s+maxv > 0)
fout<<s+maxv;
else fout<<0;
}