Cod sursa(job #2260895)

Utilizator daru06Daria Culac daru06 Data 15 octombrie 2018 18:53:52
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.04 kb
/// http:///www.infoarena.ro/problema/scmax
/// 70 p pe infoarena, doar pentru ilustrarea programarii dinamice
#include <fstream>

using namespace std;

ifstream fi("scmax.in");
ofstream fo("scmax.out");
int l[100001], a[100001], n, lmax, imax;

void citeste () {
  int i;

  fi >> n;
  for (i = 1; i <= n; i++)
    fi >> a[i];
}

void dinamic() {
  int ml, i, j;
  /// ml - maximul lungimilor subsirurilor crescatoare care incep dupa pozitia "i" cu un element > a[i]

  l[n] = 1;                          /// initializare
  for (i = n-1; i >= 1; i--) {       /// pentru fiecare element din sir
    ml = 0;                          /// initializarea maximului
    for (j = i+1; j <= n; j++)       /// pentru fiecare element din dreapta elementului curent
      if (a[i] < a[j] and l[j] > ml) /// Sunt indeplinite conditiile?
        ml = l[j];                   /// Actualizam maximul lungimilor subsirurilor care incep dupa elementul curent.
    l[i] = ml+1;                     /// lungimea celui mai lung subsir care incepe pe locul i
  }
}

void maxim () {
  int i;

  lmax = l[1]; imax = 1;
  for (i = 1; i <= n; i++)
    if (l[i] > lmax) {
      lmax = l[i]; imax = i;
    }
}

void scrie() {
  int i, is, id;

  fo << lmax << endl;                          /// Afisam lungimea maxima.
  fo << a[imax] << ' ';                        /// primul element din subsir
  for (is = imax, id = is+1; id <= n; id++)    /// indici pentru elementele unei perechi: stanga, dreapta
    if (a[is] < a[id] and l[id] == l[is]-1) { /// Suntem la urmatorul element din subsirul cautat?
      fo << a[id] << ' ';                      /// Scriem elementul.
      is = id;                                 /// Pregatim indicelele stanga din urmatoarea pereche.
    }
}

//void scrie() {
//  int i;
//
//  fo << lr << endl;
//  for (i = imax; i <= n; i++)
//    if ((a[i] >= a[imax]) and (lr == l[i])) {
//      fo << a[i] << ' ';
//      lr--;
//    }
//}


int main() {
  citeste();
  dinamic();
  maxim();
  scrie();
  return 0;
}