Pagini recente » Cod sursa (job #1456672) | Cod sursa (job #2483114) | Cod sursa (job #124977) | Borderou de evaluare (job #804536) | Cod sursa (job #2032307)
#include <fstream>
using namespace std;
ifstream fin("ferma.in");
ofstream fout("ferma.out");
int n,k,i,x[10005],j,a[10005],b1[10005],b[10005],pa[10005],pb[10005],pb1[10005],mx;
int main()
{fin>>n>>k;
for(i=1;i<=n;i++)
{fin>>x[i];
}
for(i=1;i<=n;i++)
x[i+n]=x[i];
for(i=1;i<=k;i++)
{for(j=1;j<=2*n;j++)
{a[j]=max(b1[j-1],max(0,max(b1[j-1]+x[j],a[j-1]+x[j])));
if(a[j]==0)pa[j]=j+1;
else if(a[j]==x[j])pa[j]=j;
else {if(a[j]==b1[j-1]+x[j]&&a[j]>a[j-1]+x[j])pa[j]=pb1[j-1];
else if(a[j]==a[j-1]+x[j]&&a[j]>b1[j-1]+x[j])pa[j]=pa[j-1];
else pa[j]=max(pb1[j-1],pa[j-1]);
}
b[j]=max(a[j-1],b[j-1]);
if(j-pa[j]>=n){pa[j]++;a[j]-=x[j];}
if(b[j]==a[j-1]&&b[j]>b[j-1])pb[j]=pa[j-1];
else if(b[j]==b[j-1]&&b[j]>a[j-1])pb[j]=pb[j-1];
else pb[j]=max(pa[j-1],pb[j-1]);
if(j-pb[j]>=n){pb[j]++;b[j]-=x[j];}
//fout<<a[j]<<"("<<b[j]<<")"<<" ";
if(mx<a[j])mx=a[j];
}
//fout<<"\n";
for(j=1;j<=n;j++)
{b1[j]=b[j];
pb1[j]=pb[j];
}
}
fout<<mx;
}