Cod sursa(job #2900554)

Utilizator andreipirjol5Andrei Pirjol andreipirjol5 Data 11 mai 2022 10:06:18
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <cstdio>

using namespace std;
FILE *fin, *fout;

int max(int a, int b)
{
    return (a > b) ? a : b;
}

#define NMAX 100000
int v[NMAX + 5], sol[NMAX + 5], prev[NMAX + 5], a[NMAX + 5];

int maxim;

int main()
{
    fin = fopen("scmax.in", "r");
    fout = fopen("scmax.out", "w");

    int n;
    fscanf(fin, "%d", &n);
    int i;
    for(i = 1; i <= n; i++)
        fscanf(fin, "%d", &v[i]);

    i = 1;
    sol[i] = 1;

    int j, ind;
    prev[i] = -1;

    for(i = 2; i <= n; i++)
    {
        maxim = ind = 0;

        for(j = 1; j < i; j++)
            if(v[j] < v[i])
                if(sol[j] > maxim)
                {
                    maxim = sol[j];
                    ind = j;
                }

        sol[i] = maxim + 1;
        if(ind == 0)
            prev[i] = -1;
        else
            prev[i] = ind;
    }

    //for(i = 1; i <= n; i++)
        //fprintf(fout, "%d ", prev[i]);

    maxim = 0;
    int indmax;
    for(i = 1; i <= n; i++)
    {
        if(sol[i] > maxim)
        {
            maxim = sol[i];
            indmax = i;
        }
    }

    fprintf(fout, "%d\n", maxim);

    i = indmax;
    int k = 0;
    while(i != -1)
    {
        a[++k] = v[i];

        i = prev[i];

        //a[++k] = v[prev[i]];
    }

    for(i = k; i >= 1; i--)
        fprintf(fout, "%d ", a[i]);

    fclose(fin);
    fclose(fout);
    return 0;
}