Pagini recente » Cod sursa (job #2883464) | Cod sursa (job #946513) | Cod sursa (job #2857832) | Cod sursa (job #1917144) | Cod sursa (job #2207772)
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#define max(a, b) ((a > b) ? a : b);
int main() {
int n;
FILE * fin = fopen("scmax.in", "r");
assert(fin != NULL);
fscanf(fin, "%d", &n);
int * v = (int *)calloc(n, sizeof(int));
assert(v != NULL);
for (int i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
fclose(fin);
// pd[i] = lungimea subsirului crescator ce se termina la i
int * pd = (int *)calloc(n+1, sizeof(int));
assert(pd != NULL);
pd[0] = 1; // primul element formeaza un sir de lungime maxima 1
// t[i] = de unde provine sirul ce se ajunge in i
int * t = (int *)calloc(n+1, sizeof(int));
assert(t != NULL);
t[0] = 0;
int lower = 0;
int maxlen = INT_MIN;
int maxel = -1;
for (int i = 1; i < n; ++i) {
lower = 0;
for (int j = 0; j < i; ++j) {
if ((v[j] < v[i]) && (pd[i] < pd[j] + 1)) {
lower = 1;
pd[i] = pd[j] + 1;
t[i] = j;
}
}
if (lower == 0) {
// nu am gasit niciunul mai mic ca el,
pd[i] = 1;
t[i] = 0;
}
if (maxlen < pd[i]) {
maxlen = pd[i];
maxel = i;
}
}
int * sol = (int *)calloc(n+1, sizeof(int));
assert(sol != NULL);
int dim = 0;
FILE * fout = fopen("scmax.out", "w");
assert(fout != NULL);
fprintf(fout, "%d\n", maxlen);
int r = maxel;
while (r != 0) {
sol[dim++] = r;
r = t[r];
}
for (int i = dim - 1; i >= 0; --i)
fprintf(fout, "%d ", v[sol[i]]);
fprintf(fout, "\n");
fclose(fout);
free(pd);
free(v);
free(t);
free(sol);
return 0;
}