Pagini recente » Cod sursa (job #2078910) | Borderou de evaluare (job #2019429) | Borderou de evaluare (job #1570254) | Cod sursa (job #2342211) | Cod sursa (job #2207904)
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <limits.h>
#define max(a, b) ((a > b) ? a : b);
void afisare(FILE * fout, int * v, int * t, int el) {
if (el == -1)
return;
afisare(fout, v, t, t[el]);
fprintf(fout, "%d ", v[el]);
}
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] = -1;
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;
}
}
FILE * fout = fopen("scmax.out", "w");
assert(fout != NULL);
fprintf(fout, "%d\n", maxlen);
afisare(fout, v, t, maxel);
free(pd);
free(v);
free(t);
return 0;
}