Cod sursa(job #976603)

Utilizator mitrutstrutMitrea Andrei Ionut mitrutstrut Data 23 iulie 2013 14:54:59
Problema Ferma Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 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];
    }
  }
}