Pagini recente » Cod sursa (job #2053062) | Cod sursa (job #2915428) | Cod sursa (job #2825978) | Cod sursa (job #382341) | Cod sursa (job #2207771)
#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(fin != NULL);
for (int i = 0; i < n; ++i)
fscanf(fin, "%d", &v[i]);
// 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;
}
}
for (int i = 0; i < n; ++i)
printf("%d ", pd[i]);
printf("\n");
int * sol = (int *)calloc(n+1, sizeof(int));
assert(sol != NULL);
int dim = 0;
printf("%d\n", maxlen);
int r = maxel;
while (r != 0) {
sol[dim++] = r;
r = t[r];
}
for (int i = dim - 1; i >= 0; --i)
printf("%d ", v[sol[i]]);
printf("\n");
return 0;
}