Pagini recente » Cod sursa (job #1246137) | Cod sursa (job #2596880) | Cod sursa (job #2130091) | Monitorul de evaluare | Cod sursa (job #266444)
Cod sursa(job #266444)
#include <stdio.h>
int N;
int A[100000];
int L[100000];
int P[100000];
int M[100000];
inline int max(int a, int b) {
return ((a > b) ? (a) : (b));
}
int main(int argc, char *argv[]) {
int i, j, ML;
FILE *fi = fopen("scmax.in", "r");
fscanf(fi, "%d", &N);
for (i = 0; i < N; ++i)
fscanf(fi, "%d", A+i);
fclose(fi);
L[0] = 1;
M[0] = 1;
for (i = 1; i < N; ++i) {
for (j = i-1; j >= 0; --j) {
if (L[i] > M[j])
break;
if ((A[i] > A[j]) && (!L[i] || (L[j]+1 > L[i]))) {
P[i] = j;
L[i] = L[j] + 1;
}
}
if (!L[i]) {
L[i] = 1;
P[i] = i;
}
M[i] = max(M[i-1], L[i]);
}
/*for (i = 0; i < N; ++i)
printf("%d ", A[i]);
printf("\n");
for (i = 0; i < N; ++i)
printf("%d ", L[i]);
printf("\n");
for (i = 0; i < N; ++i)
printf("%d ", P[i]);
printf("\n");*/
ML = M[N-1];
j = ML-1;
for (i = N-1; L[i] != ML; --i)
;
for (; i != P[i]; i = P[i], --j)
M[j] = A[i];
M[0] = A[i];
FILE *fo = fopen("scmax.out", "w");
fprintf(fo, "%d\n", M[N-1]);
for (i = 0; i < ML; ++i)
fprintf(fo, "%d ", M[i]);
fprintf(fo, "\n");
fclose(fo);
return 0;
}