Cod sursa(job #1254868)

Utilizator doruliqueDoru MODRISAN dorulique Data 3 noiembrie 2014 17:15:14
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>

int a[100001],t[100001],l[100001];

/**
 t[i] = vectorul de tatzi. <=> t[i] = indicele elemenului care il precede pe a[i]
                  in subshirul maximal care se termina in a[i].
        Daca a[i] incepe un nou subshir, t[i]=0.
 l[i] = lungimea maxima a subshirului din care face parte a[i].
        DAca a[i] incepe un subshir nou, atunci l[i]=0.
        Daca nu, l[i]=l[t[i]]+1.

*/

int main()
{
    int n,i,jmax,j,lmax,lsmax=0,imax;
    FILE *f=fopen("scmax.in","r");
    fscanf(f,"%d",&n);
    for(i=1;i<=n;i++)
    {
        fscanf(f,"%d",&a[i]);
        //verif. dintre TOATE alea de dinainte, dupa care poate fi pus a[i].
        //shi-l aleg pe-ala care are l[i] maxim:
        lmax=jmax=0;
        for(j=1;j<i;j++)
            if(a[i]>a[j] && l[j]>lmax)
                            lmax=l[jmax=j];
        t[i]=jmax;
        l[i]=lmax+1;
        if(l[i]>lsmax)
            lsmax=l[imax=i];
    }
    f=fopen("scmax.out","w");
    fprintf(f,"%d\n",lsmax);
    j=lsmax;
    for(i=imax;i;i=t[i])
                l[j--]=a[i];
    for(i=1;i<=lsmax;i++)
        fprintf(f,"%d ",l[i]);
    fprintf(f,"\n");
    return 0;
}