Pagini recente » Cod sursa (job #2903301) | Cod sursa (job #3157474) | Cod sursa (job #2130790) | Cod sursa (job #2099615) | Cod sursa (job #1468730)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 5005
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
#define LEN(X) ((X)&0xffff)
#define START(X) ((X)>>16)
int N, a[NMAX], b[NMAX], p[NMAX][NMAX], i, j, nb, sol = -1, l1, l2;
int cmp(const void *a, const void *b)
{
return ( *(int*)a - *(int*)b );
}
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);
b[i] = a[i];
}
qsort(&b[1], N, sizeof(int), cmp);
nb = 1;
for (i = 2; i <= N; i++)
{
if (b[i] > b[nb])
b[++nb] = b[i];
}
for (i = 1; i <= nb; i++)
for (j = 1; j <= N; j++)
{
if (a[j] == b[i])
{
p[i][j] = 1 + LEN(p[i-1][j-1]);
if (i == 1 || j == 1)
p[i][j] += (j<<16);
else
p[i][j] += (START(p[i-1][j-1])<<16);
}
else
{
l1 = LEN(p[i-1][j]), l2 = LEN(p[i][j-1]);
if (l1 > l2)
p[i][j] = p[i-1][j];
else if (l2 > l1)
p[i][j] = p[i][j-1];
else
p[i][j] = (MAX(START(p[i][j-1]), START(p[i-1][j])) << 16) + l1;
}
}
j = N;
while((p[nb][j]&0xffff) == nb)
{
if (sol == -1 || j - START(p[nb][j]) + 1 < sol)
sol = j - START(p[nb][j]) + 1;
j--;
}
fprintf(out, "%d\n", sol);
fclose(in);
fclose(out);
return 0;
}