Pagini recente » Cod sursa (job #3157453) | Cod sursa (job #890538) | Cod sursa (job #1614854) | Cod sursa (job #2977409) | Cod sursa (job #1468689)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 5005
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
int N, a[NMAX], b[NMAX], c[NMAX], i, j, p[NMAX][NMAX], nb, start, end, aux;
int cmp(const void *a, const void *b)
{
return ( *(int*)a - *(int*)b );
}
void print()
{
for (i = 1; i <= nb; i++)
printf("%d ", b[i]);
printf("\n");
for (i = 1; i <= nb; i++)
{
for (j = 1; j <= N; j++)
{
if (a[j] == b[i])
printf("*%d ", p[i][j]);
else
printf("%2d ", p[i][j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
FILE *in, *out;
in = fopen("secv.in", "r");
out = fopen("secv.out", "w");
fscanf(in, "%d\n", &N);
for (i = 1; i <= N; i++)
{
fscanf(in, "%d", a+i);
c[i] = a[i];
}
qsort(&c[1], N, sizeof(int), cmp);
nb = 1;
b[nb] = c[1];
for (i = 2; i <= N; i++)
{
if (c[i] > b[nb])
b[++nb] = c[i];
}
for (i = 1; i <= nb; i++)
for (j = 1; j <= N; j++)
{
if (a[j] == b[i])
p[i][j] = 1 + p[i-1][j-1];
else
p[i][j] = MAX(p[i-1][j], p[i][j-1]);
}
if (p[nb][N] < nb) //fara solutie
{
fprintf(out, "0\n");
goto done;
}
j = N;
while(p[nb][j] == nb)
j--;
end = j;
i = nb-1, j = end-1;
while (i)
{
if (a[j] == b[i])
{
start = i;
j--, i--;
}
else
j--;
}
fprintf(out, "%d\n", end-start+1);
done:
fclose(in);
fclose(out);
return 0;
}