Cod sursa(job #755881)

Utilizator Victor10Oltean Victor Victor10 Data 7 iunie 2012 23:14:41
Problema Subsir 2 Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <cstdio>
#include <algorithm>
#define DMAX 5005
using namespace std;

int A [DMAX], B [DMAX], sol [DMAX];
int nume [DMAX] [DMAX];

int main () {
	
	freopen ("subsir2.in", "r", stdin);
	freopen ("subsir2.out", "w", stdout);
	
	int n, i, j;
	
	scanf ("%d", &n);
	
	for (i = 1; i <= n; ++ i) {
		scanf ("%d", &A [i]);
		B [i] = A [i];
	}
	
	sort (B + 1, B + n + 1);
	
	for (i = 1; i <= n; ++ i)
		for (j = 1; j <= n; ++ j) {
			if( A [i] == B [j])
				nume [i] [j] = nume [i - 1] [j - 1] + 1;
			else
				nume [i] [j] = max (nume [i - 1] [j], nume [i] [j - 1]);
		}
	
	for (i = n, j = n; i && j;) {
		if (A [i] == B [j]) {
			sol [++ sol [0]] = A [i];
			-- i; -- j;
		}
		else {
			if (nume [i - 1] [j] > nume [i] [j - 1]) -- i;
			else -- j;
		}
	}
	
	printf ("%d\n", nume [n] [n]);
	for (i = sol [0]; i >= 1; -- i)
		printf ("%d ", sol [i]);
	printf ("\n");
}