Cod sursa(job #1426763)

Utilizator tsubyRazvan Idomir tsuby Data 30 aprilie 2015 16:51:44
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
// i origins
#include <iostream>
#include <cstdio>
#include <cstring>
#define NMAX 100000
using namespace std;

int n, a[NMAX], lungime_maxima[NMAX];

void determinare() {
    for(int i = 0; i < n; i++) {
        lungime_maxima[i] = 1;
        for(int j = i-1; j >= 0; j--) {
            if(a[j] < a[i] && lungime_maxima[i] < lungime_maxima[j]+1) {
                lungime_maxima[i] = lungime_maxima[j] + 1;
            }
        }
    }
}

int maxim() {
    int maxim = -1, pos = -1;
    for(int i = 0; i < n; i++)
        if(lungime_maxima[i] > maxim) {
            maxim = lungime_maxima[i];
            pos = i;
        }
    printf("%d\n", maxim);
    return pos;
}

void drum(int pos) {
    for(int j = pos-1; j >= 0; j--)
        if(lungime_maxima[pos] == lungime_maxima[j]+1 && a[pos] > a[j]) {
            pos = j;
            drum(pos);
            printf("%d ", a[pos]);
            break;
        }
}
int main()
{
    freopen("scmax.in", "r", stdin);
    //freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    determinare();
    int pos_maxim = maxim();
    drum(pos_maxim);
    printf("%d ", a[pos_maxim]);
    return 0;
}