Pagini recente » Cod sursa (job #1549041) | Cod sursa (job #1191207) | Cod sursa (job #2223605) | Cod sursa (job #686923) | Cod sursa (job #256759)
Cod sursa(job #256759)
#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=1;i<=n;i++) //trecem pe la fiecare element in parte
{
for(p=k=0,j=0;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;
}