Pagini recente » Cod sursa (job #351170) | Cod sursa (job #2988975) | Cod sursa (job #2570377) | Cod sursa (job #282131) | Cod sursa (job #285781)
Cod sursa(job #285781)
/*
*
* 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(1)
{
poz=(st + dr) / 2;
if(q[poz]<=v[i] && v[i]<q[poz+1])
{
poz++; break;
}
if(v[i]<q[poz])
dr=poz-1;
else
st=poz+1;
}
q[poz]=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;
}