Cod sursa(job #2001651)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 17 iulie 2017 13:27:57
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#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,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;

      mx=dp[j-1][l1]-s[j-1];

     for(i=j;i<=n;i++)
     { dp[i][l2]=s[i]+mx;
       if (i>j) dp[i][l2]=max(dp[i][l2],dp[i-1][l2]);
       mx=max(mx,dp[i][l1]-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 (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]);
 }

  Dinamica(k);

  CalcSums();

 for(i=k;i<=n;i++)
  sol=max(sol,dp[i][l2]+s[n]-s[i]);

   if (sol<0) g<<"0\n"; else g<<sol;
    return 0;
}