Cod sursa(job #1431053)

Utilizator Nan_Mihai_324CCNan Mihai Nan_Mihai_324CC Data 8 mai 2015 23:18:35
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <set>

using namespace std;

set<int> subsequence;

int subsecventa_recursiv(int* vect, int nr, int* maxim) {
	if(nr == 1) {
		return 1;
	} else {
		int rez, end, i;
		end = 1;
		for(i = 1; i < nr; i++) {
			rez = subsecventa_recursiv(vect, i, maxim);
			if(vect[i-1] < vect[nr-1] && rez + 1 > end) {
				end = end + 1;
				subsequence.insert(vect[i-1]);
				subsequence.insert(vect[nr-1]);
			}
		}
		if(*maxim < end) {
			*maxim = end;
		}
		return end;
	}
}

void print_subsecventa(int* vect, int end, int* prev) {
	if(end != -1) {
		print_subsecventa(vect, prev[end], prev);
		printf("%d ", vect[end]);
	}
}

int subsecventa_dinamica(int* vect, int nr) {
	int* rez = (int*) malloc(nr*sizeof(int));
	int* prev = (int*) malloc(nr*sizeof(int));
	int i, j, max = 0, end;
	rez[0] = 1;
	prev[0] = -1;
	for(i = 1; i < nr; i++) {
		rez[i] = 1;
		prev[i] = -1;
		for(j = i-1; j >= 0; j--) {
			if(vect[i] > vect[j] && rez[i] < rez[j] + 1) {
				rez[i] = rez[j] + 1;
				prev[i] = j;
			}
		}
		if(rez[i] > max) {
			max = rez[i];
			end = i;
		}
	}
	printf("%d\n", max);
	print_subsecventa(vect, end, prev);
	printf("\n");
	free(rez);
	free(prev);
	return max;
}
int main() {
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	int nr, i;
	int *vect;
	scanf("%d", &nr);
	vect = (int*) malloc(nr*sizeof(int));
	for(i = 0; i < nr; i++) {
		scanf("%d", &vect[i]);
	}
	int maxim = 1;
	maxim = subsecventa_dinamica(vect, nr);
	printf("\n");
	return 0;
}