Cod sursa(job #2434126)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 30 iunie 2019 17:29:04
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

class Solution {
	vector<int> v;
	int n;
	vector<int> pr;
	int pos = 0;

public:
	void readData() {
		ifstream f("scmax.in");
		f >> n;
		v.resize(n, 0);
		pr.resize(n, -1);
		for (int i = 0; i < n; ++i) {
			f >> v[i];
		}
	}

	int scmax() {
		vector<int> dp(n);   // in explicatii indexarea incepe de la 1

								 // caz de baza
		dp[0] = 1;   // [ v[1] ] este singurul subsir (crescator) care se termina pe 1
		pr[0] = -1;
					 // caz general
		for (int i = 1; i < n; ++i) {
			dp[i] = 1;   // [ v[i] ] - este un subsir (crescator) care se termina pe i

						 // incerc sa il pun pe v[i] la finalul tuturor solutiilor disponibile
						 // o solutie se termina cu un element v[j]
			for (int j = 0; j < i; ++j) {
				// solutia triviala: v[i]
				if (v[j] < v[i]) {
					// din (..., v[j]) pot obtine (..., v[j], v[i])
					// (caz in care prec[i] = j)

					// voi alege j-ul curent, cand alegerea imi gaseste o solutie mai buna decat ce am deja
					if (dp[j] + 1 > dp[i]) {
						dp[i] = dp[j] + 1;
						pr[i] = j;
					}
				}
			}
		}

		// solutia e maximul din vectorul dp
		int sol = dp[0];
		for (int i = 1; i < n; ++i) {
			if (dp[i] > sol) {
				sol = dp[i];
				pos = i;
			}
		}

		return sol;
	}

	void print() {
		ofstream g("scmax.out");
		g << scmax() << '\n';

		stack<int> myStack;

		while (pos != -1) {
			myStack.push(v[pos]);
			pos = pr[pos];
		}

		while (!myStack.empty()) {
			g << myStack.top() << ' ';
			myStack.pop();
		}
	}
};

int main() {
	Solution sol;
	sol.readData();
	sol.print();
}