Cod sursa(job #1377736)

Utilizator justsomedudePalade Thomas-Emanuel justsomedude Data 6 martie 2015 00:29:49
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

int maxi[100001],urm[100001],a[100001],lg,sir[100001];
int n,i,j,start;

void Citire()
{
    ifstream fin("LIS.in");
    fin>>n;
    for (i=1; i<=n; i++)
        fin>>a[i];
    fin.close();
}

void LIS()
{
    /// intializari
    maxi[n]=1;
    urm[n]=-1;

    for (i=n-1; i>=1; i--)
    {
        maxi[i]=1;
        urm[i]=-1;

        for (j=i+1; j<=n; j++)
        {
            if (a[i]<a[j] && maxi[i] <= maxi[j])
            {
                maxi[i]=maxi[j]+1;
                urm[i]=j;
            }
        }
    }

    /// sa gasim maximul
    lg=maxi[1];
    start=1;
    for (i=2; i<n; i++)
    {
        if (maxi[i]>lg)
        {
            lg=maxi[i];
            start=i;
        }
    }
}

void Afisare()
{
    ofstream fout("LIS.out");
    fout<<"lungimea e "<<lg<<"\n"; /// lungimea subsirului crescator de lg max

    // sa creem subsirul
    sir[1]=a[start];
    for (i=2; i<=lg; i++)
    {
        start=urm[start];
        sir[i]=a[start];
    }

    for (i=1; i<=lg; i++)
        fout<<sir[i]<<" ";       /// elementele sirului se afiseaza aici
    fout.close();
}

int main ()
{
    Citire();
    LIS();
    Afisare();
    return 0;
}