Cod sursa(job #2207906)

Utilizator Vali_DeaconuVali Deaconu Vali_Deaconu Data 27 mai 2018 11:53:15
Problema Subsir crescator maximal Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.36 kb
#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] = -1;
		}

		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;
}