Cod sursa(job #955388)

Utilizator sorin2kSorin Nutu sorin2k Data 31 mai 2013 18:01:23
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<fstream>
using namespace std;
int n, *a, *pre, *m;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

void subsir_max(int t) 
{
	// va returna lungimea maxima a unui subsir care are cel mai mare element < t
	int i, maxim = 0, imax = -1;
	// cautam subsirul care are dim. maxima (m[i] > maxim) dar cu cel mai mare element mai mic decat elementul curent (a[t] > a[i])
	for(i = 0; i < t; i++)
	{
		if(a[t] > a[i] && m[i] > maxim)
		{
			maxim = m[i];
			imax = i;
			pre[t] = i;
			m[t] = maxim + 1;
		}
	}
	if(imax == -1)
	{
		m[t] = 1;
		pre[t] = -1;
	}
}

void afis_sol(int i)
{
	if(pre[i] != -1)
	{
		afis_sol(pre[i]);
		fout << a[i] << " ";
	}
	else
		fout << a[i] << " ";
}

int main()
{
	int i, max, imax;
	fin >> n;
	a = new int[n];
	pre = new int[n];
	m = new int[n];
	for(i = 0; i < n; i++)
		fin >> a[i];
	pre[0] = -1;
	m[0] = 1;
	for(i = 1; i < n; i++)
	{
		subsir_max(i);
	}
	max = 0;
	imax = 0;
	for(i = 0; i < n; i++) // cautam elementul la care se opreste cel mai mare subsir crescator
	{
		if(m[i] > max)
		{
			max = m[i];
			imax = i;
		}
	}
	fout << max << endl;
	afis_sol(imax);
	return 0;
}