Cod sursa(job #96264)

Utilizator info_arrandrei gigea info_arr Data 31 octombrie 2007 21:02:46
Problema Ferma Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <cstdio>
#include <fstream>

using namespace std;

#define FIN "ferma.in"
#define FOUT "ferma.out"
#define MAX_N 10005
#define MAX_K 1005

int L1[MAX_N];
int L2[MAX_N]; // liniile din dinmica

int A[MAX_N];
int S[MAX_N];

int N, K, i;
int BEST; //solutia


    inline int MAX (int a, int b) { if (a > b) return a; else return b; }

    void init ()
    {
         int i, Sc, M;
         
         for (i = 1; i <= N; ++i) S[i] = S[i - 1] + A[i];
         
         L1[1] = Sc = M = A[1];
         
         for (i = 2; i <= N; ++i)
         { 
             if (Sc < 0) Sc = A[i];
                else Sc += A[i];
             if (Sc > M) M = Sc;
             
             L1[i] = M;
         }
    }

    void solve (void)
    {
         int i, j;
         
         init ();
         
       //  for (i = 1; i <= N; ++i)
       //    printf ("%d ", L1[i]);
         
         for (i = 2; i <= K; ++i)
         {   
             int Mx = L1[1] - S[1];
             for (j = 2; j <= N; ++j)
             {
                 L2[j] = MAX (L2[j - 1], Mx + S[j]);
                 if (L1[j] - S[j] > Mx) Mx = L1[j] - S[j];
             }
             
             memcpy (L1, L2, sizeof (L2));
         }
         
         BEST = L2[N];
         
         memset (L2, 0, sizeof (L2));
         memcpy (L1, S, sizeof (S));
         
         for (i = 2; i <= K; ++i)
         {   
             int Mx = L1[1] - S[1];
             for (j = 2; j <= N; ++j)
             {
                 L2[j] = MAX (L2[j - 1], Mx + S[j]);
                 if (L1[j] - S[j] > Mx) Mx = L1[j] - S[j];
             }
             
             memcpy (L1, L2, sizeof (L2));
         }
         
         for (i = 1; i <= N; ++i)
             BEST = MAX (BEST, L2[i] + S[N] - S[i]);
         if (BEST < 0) BEST = 0;
         printf ("%d\n", (int) (BEST));
    }

    int main ()
    {
        freopen (FIN, "r", stdin);
        freopen (FOUT, "w", stdout);
        
        scanf ("%d %d",&N, &K);
        
        for (i = 1; i <= N; ++i) scanf ("%d", A + i);
        
        solve ();
        
        return 0;
    }