Cod sursa(job #973627)

Utilizator toranagahVlad Badelita toranagah Data 14 iulie 2013 21:36:45
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("ferma.in");
ofstream fout("ferma.out");

const int MAX_N = 10005;
const int MAX_K = 1005;
const int INF = 1 << 30;

int N, K;
int p[MAX_N];
int d[2][MAX_K][2];

void init(bool circ);
void solve(bool circ);

int main() {
  fin >> N >> K;
  for (int i = 1; i <= N; ++i) {
    fin >> p[i];
  }
  
  solve(0);
  int result = max(d[N & 1][K][0], d[N & 1][K][1]);

  solve(1);
  result = max(result, d[N & 1][K + 1][1]);
  result = max(result, 0);
  fout << result;
  return 0;
}

void init(bool circ) {
  for (int i = 0; i <= K + circ; ++i) {
    d[circ][i][0] = d[circ][i][1] = -INF;
  }
  d[circ][circ][circ] = p[circ];
}

void solve(bool circ) {
  init(circ);
  for (int ii = 1 + circ; ii <= N; ++ii) {
    int i = ii & 1, l = (ii - 1) & 1;
    d[i][0][0] = d[l][0][0];
    d[i][0][1] = -INF;
    for (int j = 1; j <= K + circ; ++j) {
      d[i][j][0] = max(d[l][j][0], d[l][j][1]);
      d[i][j][1] = max(d[l][j][1], d[i][j - 1][0]) + p[ii];
    }
  }
}