Cod sursa(job #594612)

Utilizator rudarelLup Ionut rudarel Data 8 iunie 2011 15:31:25
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <algorithm>
 
using namespace std;
 
#define MAX_N 10010
#define MAX_K 1024
 
int n, k, t, l, dr, sol, poz;
int A[MAX_N], sum[MAX_N];
int c[MAX_N][2];
 
void cit() {
    freopen("ferma.in", "r", stdin);
    freopen("ferma.out", "w", stdout);
 
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &A[i]);
        sum[i] = sum[i - 1] + A[i];
    }
}
 
void solve() {
    for (t = 0; t < 2; t++) {
        //t = 0 nu iau primul element, t = 1 iau primul element
         
        l = 0;
        for (int j = 1; j <= k; j++) {
            l = 1 - l; dr = 0;
            poz = 0;
         
            for (int i = j; i <= n; i++) {
                if (t && j == k && i == n) break;
                if (t && j == 1) poz = 0;
                 
                c[i][l] = max(c[poz][1 - l] + sum[i] - sum[poz], c[i - 1][l]);
 
                if (c[i][1 - l] > c[poz][1 - l] + sum[i] - sum[poz])
                    poz = i;
            }
             
            if (t && j == k)
                for (int i = k; i < n; i++)         
                    c[n][l] = max(c[n][l], c[i][l] + sum[n] - sum[i]);
 
            if (j == k)
                sol = max(sol, c[n][l]);
             
            for (int i = 1; i <= n; i++)
                c[i][1 - l] = 0;
        }
        for (int i = 1; i <= n; i++)
            c[i][l] = 0;
    }
 
    printf("%d\n", sol);
}
 
int main() {
 
    cit();
    solve();
     
    return 0;
}