Cod sursa(job #2759499)

Utilizator alex.andraa5Ursu Alexandra alex.andraa5 Data 18 iunie 2021 15:24:17
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
void scmax(int n, vector<int> &v) {
	vector<int> dp(n + 1);   // în explicații indexarea începe de la 1
 
	// caz de bază
	dp[1] = 1;   // [ v[1] ] este singurul subșir (crescător) care se termină pe 1
 
	// caz general
	for (int i = 2; i <= n; ++i) {
		dp[i] = 1;   // [ v[i] ] - este un subșir (crescător) care se termină pe i
 
		// încerc să îl pun pe v[i] la finalul tuturor soluțiilor disponibile
		// o soluție se termină cu un element v[j]
		for (int j = 1; j < i; ++j) {
			// soluția trivială: v[i]
			if (v[j] < v[i]) {
				// din (..., v[j]) pot obține (..., v[j], v[i])
				// (caz în care prec[i] = j)
 
				// voi alege j-ul curent, când alegerea îmi găsește o soluție mai bună decât ce am deja
				if (dp[j] + 1 > dp[i]) {
					dp[i] = dp[j] + 1;
				}
			}
		}
	}
 
	// soluția e maximul din vectorul dp
	int sol = dp[1], pos = 1;
	for (int i = 2; i <= n; ++i) {
		if (dp[i] > sol) {
			sol = dp[i];
			pos = i;
		}
	}
 
	return sol;
}