Cod sursa(job #360342)

Utilizator andrei_vs2009Cozma Andrei andrei_vs2009 Data 31 octombrie 2009 10:01:48
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
/*
   a= 3 1 5 4 2  7 3 4  9  8   9   5   1
 lis= 5 6 4 4 5  3 4 3  2  2   1   1   1 
pred= 3 5 6 6 7 11 8 9 11 11 inf inf inf

lis[i]= lungimea maxima a unui subsir din a[i...n] si care incepe la poz i
pred[i]=j : a[i] este inaintea lui a[j] in subsirul maximal

*/

#include<fstream>

using namespace std ;

int a[10001],lis[10001], n , pred[10001], sol[10001];
// pred[i] = p : a[i] are pe a[p] ca predecesor in sirul de lungime maxima

void ReadData()
{
	int i ;
	ifstream f("scmax.in") ;
	f>>n ;
	for (i=1 ; i<=n ; i++)
		f>>a[i] ;
	f.close() ;
}

void LIS1()
{
	int i, j, max, p,min ;
	lis[n] = 1 ;
	pred[n] = 0;
	for (i=n-1 ; i>=1 ; i--)
	{
		max = 0 ; p = -1 ; min = 10000001 ;
		for (j=i+1 ; j<=n ; j++)
			if ((a[i]<=a[j]) && (max <= lis[j])&&(min > a[j]))
			{
				max = lis[j] ; p = j ; min = a[j] ;
			}	
		lis[i] = 1 + max ;
		if (p != -1) pred[i] = p ;
			else pred[i] = 0 ;
	}
}

void PrintSol1()
{
	int i,max,p, k,min ;
	ofstream f("scmax.out") ;
	max = 0 ; min = 1000001 ;
	for (i=1 ; i<=n ; i++)
		if (max < lis[i]) { max = lis[i] ; p = i ; min = a[i] ;}
		else if ((max == lis[i])&&(min > a[i]))
		{
			p = i ; min = a[i] ;
		}
	f<<max<<"\n" ;
	k = 0 ;
	while (p > 0)
	{
		sol[++k] = a[p] ;
		p = pred[p] ;
	}
	for (i=1 ; i<=k ; i++) f<<sol[i]<<" " ;
	f.close() ;
}

int main()
{
	ReadData() ;
	LIS1() ;
	PrintSol1() ;
	return 0 ;
}