Cod sursa(job #1547774)

Utilizator mihai.constantinConstantin Mihai mihai.constantin Data 9 decembrie 2015 21:09:49
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <cstdio>
using namespace std;

const int dmax = 100000;

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 CARE PRECEDA ELEMENTUL DE PE POZITIA i
int v[dmax+1];
int N;

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

    calcul( pre[p] );

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

int SCM(int a[dmax+1], int &p)
{
    int i, j, L_max;

    best[1] = 1; L_max = 1;
    pre[1] = -1;

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

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

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

    return L_max;
}

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

    int i, p;

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

    printf("%d\n", SCM(v, p));

    calcul(p);

    return 0;
}