Cod sursa(job #2207771)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 26 mai 2018 19:15:33
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.37 kb
#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;
}