Cod sursa(job #3350936)

Utilizator robert.stefanRobert Stefan robert.stefan Data 14 aprilie 2026 21:07:16
Problema Subsir crescator maximal Scor 35
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
// https://www.infoarena.ro/problema/scmax

#include<fstream>

using namespace std;

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

int n;
int sir[100001];

// dp[i] memoreaza lungima maxima a subsirului crescator ce se incheie cu elementul i
int dp[100001];

// posMax reprezinta pozitia ultimului element care face parte din subsirul crescator de lungime maxima
// initial, posMax ia valoarea 0, adica cel mai lung subsir crescator este format doar din primul element al sirului
// (memorarea subsirului incepe de la pozitia 0)
int posMax = 0;

int main() {
	fin >> n;

	for(int i = 0; i < n; i++) {
		fin >> sir[i];
	}

	// primul element face parte dintr-un subsir crescator de lungime 1 (nu are niciun alt element in fata lui),
	// deci vom rula algoritmul de programare dinamica incepand cu al doilea element
	dp[0] = 1;

	for(int i = 1; i < n; i++) {
		// initial, lungimea subsirului ce se termina cu elementul sir[i] este 1 (subsirul care are doar pe sir[i] ca element)
		dp[i] = 1;

		// verificam in stanga elementului daca gasim elemente mai mici decat el
		for(int j = 0; j < i; j++) {
			if(sir[j] < sir[i]) {
				// daca am gasit un element mai mic decat el, atunci il putem adauga in subsirul crescator
				// iar lungima subsirului ce se termina cu sir[i] va fi egala cu lungimea subsirului ce se termina cu sir[j] + 1
				// doar ca putem gasi mai multe elemente mai mici decat sir[i], iar atunci vom alege elementul care ne ofera o lungime cat mai mare
				if(dp[i] < dp[j] + 1){
					dp[i] = dp[j] + 1;
				}
			}
		}

		// actualizam pozitia la care am gasit lugima maxima
		if(dp[posMax] < dp[i]) {
			posMax = i;
		} 
	}

	fout << dp[posMax] << endl;


	fin.close();
	fout.close();

	return 0;
}