Cod sursa(job #1527794)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 18 noiembrie 2015 19:09:28
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <cstdio>
using namespace std;

const int dmax = 100000;

int a[dmax+1];
int best[dmax+1]; // best[i] = LUNGIMEA MAX A UNUI SUBSIR CARE SE TERMINA PE POZITIA i
int pre[dmax+1]; // pre[i] = POZITIA VALORII ANTERIOARE ELEMENTULUI a[i] DIN SUBSIRUL CARE SE TERMINA PE POZITIA i
int N, L_max;

void calcul(int p)
{
    if(pre[p] == -1) { printf("%d ", a[p]); return; }

    calcul(pre[p]);

    printf("%d ", a[p]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    int p;

    scanf("%d", &N);
    for(int i = 1; i <= N; i++) scanf("%d", &a[i]);

    best[1] = 1; L_max = 1;

    pre[1] = -1;

    for(int i = 2; i <= N; i++)
    {
        best[i] = 1;
        pre[i] = -1;

        for(int j = 1; j < i; j++)
        {
            if(best[i] < 1 + best[j] && a[i] > a[j])
            {
                best[i] = 1 + best[j];

                pre[i] = j;

                if(L_max < best[i]) { L_max = best[i]; p = i; }
            }
        }
    }

    printf("%d\n", L_max);

    calcul(p);

    return 0;
}