Cod sursa(job #256753)
#include<stdio.h>
#define infile "scmax.in"
#define outfile "scmax.out"
#define nmax (100*1000+1)
int v[nmax]; //vectorul cu subsirul
int a[nmax]; //vectorul axiliar
int b[nmax]; //vectorul care stie pozitia elementului anterior pt refacerea subsirului
int n; //lungimea sirului
void citire(int v[nmax], int *n)
{
int i;
scanf("%d\n",n);
for(i=1;i<=*n;i++)
scanf("%d",&v[i]);
}
//dinamica cu care aflam subsirul crescator maximal
void dinamica()
{
int i,j,k,p;
for(i=2;i<=n;i++) //trecem pe la fiecare element in parte
{
for(p=k=0,j=1;j<i;j++) //cautam in toate elementele rezolvate, pe care acesta sa-l continue
if(v[j]<v[i]&&a[j]>k) //daca am gasit un element mai mic, si daca are lungime mai mare
k=a[j],p=j; //salvam lungimea, si pozitia
a[i]=k+1,b[i]=p; //salvam lungimea maxima e se poate obtine pana in i, si caracterul ce il precede
}
}
//afiseaza recursiv subsirul (in postordine)
void afisare_subsir(int k)
{
if(b[k]) afisare_subsir(b[k]); //afisem intai elementul anterior
printf("%d ",v[k]);
}
void afisare()
{
int i,j=0,k=0;
for(i=1;i<=n;i++)
if(a[i]>k) k=a[i],j=i; //am gasit un sir de lungime mai mare
printf("%d\n",k); //afisem lungimea sirului de lungime maxima
afisare_subsir(j); //afisem si subsirul
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
citire(v,&n); //citim
dinamica(); //creeam cei doi vectori auxiliari
afisare(); //afisem
fclose(stdin);
fclose(stdout);
return 0;
}