Cod sursa(job #1088324)

Utilizator casuneanu.andreiCasuneanu Andrei Dan casuneanu.andrei Data 20 ianuarie 2014 14:37:56
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
//
//  main.cpp
//  subsir_crescator_maximal
//
//  Created by Casuneanu Andrei on 20/01/14.
//  Copyright (c) 2014 Casuneanu Andrei. All rights reserved.
//

#include <fstream>
#define NMAX 1008
using namespace std;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

void citire();
void showtime();//programarea dinamica
void constr_sol();
void afisare();

int n;
int a[NMAX];
int Lg[NMAX];
int prec[NMAX];
int sir[NMAX];//construiesc solutia
int lgmax, pozmax;


int main(int argc, const char * argv[])
{
	citire();
	showtime();
	constr_sol();
	afisare();
    return 0;
}

void afisare()
{
	fout <<lgmax<<'\n';
	int i;
	for (i=lgmax; i>0; i--)
		fout <<sir[i]<<' ';
	fout <<'\n';
	fout.close();
}

void constr_sol()
{
	lgmax=0;
	
	int i;
	for (i=1; i<=n; i++)
		if (lgmax<Lg[i])
		{
			lgmax=Lg[i];
			pozmax=i;
		}
	//construiesc sirul
	i=pozmax;
	int crt=0;
	while (i)
	{
		sir[++crt]=a[i];
		i=prec[i];
	}
}

void showtime()
{
	Lg[1]=1;
	prec[1]=0;
	
	int i, j;
	for (i=2; i<=n; i++)
	{
		Lg[i]=1;
		prec[i]=0;
		for (j=1; j<i; j++)
			if (a[j]<a[i] && Lg[j]+1>Lg[i])
			{
				Lg[i]=1+Lg[j];
				prec[i]=j;
			}
	}
}

void citire()
{
	fin >>n;
	int i;
	for (i=1; i<=n; i++)
		fin >>a[i];
}