Pagini recente » Cod sursa (job #1275319) | Cod sursa (job #1674290) | Cod sursa (job #3149993) | Cod sursa (job #3176898) | Cod sursa (job #285809)
Cod sursa(job #285809)
/*
*
* Determina subsirul crescator maximal folosid algoritmul clasic, de complexitate n*n
*
* */
#include <stdio.h>
#include <stdlib.h>
#define DIM 100001
#define INFINIT 2000000001
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");
}
int Insert(int x, int st, int dr)
{
int mijloc=(st+dr)/2;
if(st==dr)
{
if(st>L) q[++L+1]=INFINIT;
q[st]=x;
return st;
}
else
if(x<=q[mijloc])
return Insert(x, st, mijloc);
else
return Insert(x, mijloc+1,dr);
}
void SCM()
{
int i;
L=0; q[1]=INFINIT;
for(i=1;i<=n;i++)
p[i]=Insert(v[i],1,L+1);
}
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;
}