Pagini recente » Cod sursa (job #797745) | Cod sursa (job #1886670) | Profil M@2Te4i | Cod sursa (job #1706075) | Cod sursa (job #285789)
Cod sursa(job #285789)
/*
*
* Determina subsirul crescator maximal folosid algoritmul clasic, de complexitate n*n
*
* */
#include <stdio.h>
#include <stdlib.h>
#define DIM 100001
typedef int Vector[DIM];
FILE *fin=fopen("scmax.in","r");
FILE *fout=fopen("scmax.out","w");
Vector v, p, q;
int n,L;
void afis(int v[], int n)
{
for(int i=1;i<=n;i++)
printf("%d ",v[i]);
printf("\n");
}
void SCM()
{
int i;
q[L=1]=v[1];
p[1]=1;
for(i=2;i<=n;i++)
{
if(v[i]>q[L])
q[++L] = v[i], p[i]=L; //v[i] este mai mare decat elementele din q[]
else
{
//caut binar pozitia in q[] pentru v[i]
int st=1, dr=L, poz;
while(st<dr)
{
poz=(st + dr) / 2;
if(v[i]<=q[poz])
dr=poz;
else
st=poz+1;
}
if(st>L)
q[++L]=v[i], p[i]=L;
else
q[st]=v[i];
}
afis(q,L);
}
}
void Afisare()
{
fprintf(fout,"%d\n",L);
int *sol=(int *) malloc((L+1)*sizeof(int)); // in sol[] voi memora elementele din subsirul solutie
int j=n;
for(int i=L;i;i--)
{
//caut in p[] ultima aparitie a lui i, aflata inaintea pozitiei k[capat+1];
while(p[j]!=i) j--;
sol[i]=v[j];
}
for(int i=1;i<=L;i++)
fprintf(fout,"%d ",sol[i]);
}
void Citire()
{
fscanf(fin,"%d",&n);
for(int i=1;i<=n;i++)
fscanf(fin,"%d",v+i);
}
int main()
{
Citire();
SCM();
Afisare();
return 0;
}