Pagini recente » Cod sursa (job #3226066) | Cod sursa (job #3211330) | Cod sursa (job #510089) | Cod sursa (job #2753987) | Cod sursa (job #2021990)
#include<bits/stdc++.h>
#define maxN 10005
using namespace std;
int dp[3][maxN],m[3][maxN],v[maxN],sp[maxN],n,k,l,sol;
int main()
{
freopen("ferma.in","r",stdin);
freopen("ferma.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)
{
sp[i]=sp[i-1]+v[i];
}
/**
Rezolvam necircular
**/
l=1;
for(int i=1;i<=k;i++,l^=1)
{
// l^=1;
for(int j=1;j<=n;j++)
{
if(j>=2) dp[l][j]=v[j]+max(dp[l][j-1],m[l^1][j-2]);
else dp[l][j]=v[j]+dp[l][j-1];
m[l][j]=max(m[l][j-1],dp[l][j]);
}
}
memset(dp,0,sizeof(dp));
memset(m,0,sizeof(m));
for(int i=1;i<=n;i++)
{
dp[1][i]=sp[i];
m[1][i]=max(m[1][i-1],dp[1][i]);
}
l=0;
for(int i=2;i<=k;i++,l^=1)
{
for(int j=1;j<=n;j++)
{
if(j>=2) dp[l][j]=v[j]+max(dp[l][j-1],m[l^1][j-2]);
else dp[l][j]=v[j]+dp[l][j-1];
m[l][j]=max(m[l][j-1],dp[l][j]);
}
}
sol=0;
for(int i=n;i>=1;i--)
{
sol=max(sol,sp[n]-sp[i-1]+m[l^1][i-1]);
}
printf("%d\n",sol);
return 0;
}