Pagini recente » Cod sursa (job #1237176) | Cod sursa (job #1138368) | Cod sursa (job #2443653) | Cod sursa (job #828468) | Cod sursa (job #256853)
Cod sursa(job #256853)
#include<stdio.h>
#define infile "scmax.in"
#define outfile "scmax.out"
#define nmax (100*1000+1)
int v[nmax]; //vectorul cu sirul
int a[nmax]; //a[i]-pozitia elementului din v[], ce are o lungime a subsirului ce se termina in v[a[i]] egala cu i.
int b[nmax]; //pozitia elementului precedent in subsir crecator de lungime maxima
int l; //lungimea maxima gasita
int n; //lungimea sirului
int maxim(int a, int b)
{
if(a<b) return a;
return b;
}
void citire(int v[nmax], int *n)
{
int i;
scanf("%d\n",n);
for(i=1;i<=*n;i++)
scanf("%d",&v[i]);
}
//rezolvarea dinamica
void dinamica()
{
int i,j,k;
a[l=1]=1; //ungimea maxima este 1, si ultimul element este defapt primul element din sir
for(i=2;i<=n;i++) //trecem pe la fiecare element
{
for(j=l;j>=0;j--) //cautam inapoi in vector lungimea cea mai mare
if(v[a[j]]<v[i]) //am gasit un element de lungime maxima mai mic decat v[i]
{
//salvam la lungime daca avem un element mai mic
if(!a[j+1]) a[j+1]=i,l++;
else if(v[a[j+1]]>v[i]) a[j+1]=i;
b[i]=a[j]; //ii salvam tatal
break; //oprim cautarea
}
}
}
//pozitia ce trebuie afisata
void afisare(int p)
{
if(b[p]) afisare(b[p]); //ii afisez intai tatal
printf("%d ",v[p]); //il afisez pe el
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
citire(v,&n); //citim sirul
dinamica(); //facem dinamica
printf("%d\n",l); //afisem lungimea
afisare(a[l]); //afisem susirul incepand de la elementul de lungime maxima (pt k il afisem in psotordine)
fclose(stdin);
fclose(stdout);
return 0;
}