Cod sursa(job #1893900)

Utilizator MarCelDragMacel Dragan MarCelDrag Data 26 februarie 2017 10:44:56
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <algorithm>
using namespace std;
#define valMax 100005
int n, s[valMax], // sirul initial nemodif
    l[valMax], // lungimea maxima subsir cu elemente pana la poz curenta
    ea[valMax], // index element anterior elementului curent in subsir
    ss[valMax]; // subsirul de lunfime maxima
ifstream in("scmax.in");
ofstream out("scmax.out");
int main()
{
    // cirie
    in>>n;
    for (int i = 1; i <= n; i++){
        in>>s[i];
    }
    // cautare subsir de lungime maxima
    for (int i = 1; i <= n; i++){
        int jMax=0;
        for (int j = 1; j < i; j++){
            if(l[j]>l[jMax] && s[i]>s[j]){
                jMax=j;
            }
        }
    l[i]=l[jMax]+1;
    ea[i]=jMax;
    }
    // alegere subsir de lungime maxima din cele maxime ale fiecarui nivel
    // deoarece in D[] avem subsirul de lungime maxima care se termina cu poz curenta
    // si pot exista cazuri in care pe ultima pozitie sa avem un subsir mai scurt
    // ex: 1 3 5 8 2
    int iMax=0;
    for (int i = 1; i <= n; i++)
        if (l[iMax] < l[i])
            iMax = i;
    //afisare
    out<<l[iMax]<<'\n';
    for (int j=l[iMax],i = iMax; i>0;i=ea[i])
         ss[j--]=s[i];

    for (int i = 1; i<=l[iMax]; i++)
        out<<ss[i]<<' ';
    out<<'\n';
    return 0;
}