Cod sursa(job #2433470)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 27 iunie 2019 15:57:49
Problema Subsecventa de suma maxima Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>

using namespace std;

template < class T>
class Pair {
	T first;
	T second;
public:
	Pair() {};
	Pair(T const& x, T const& y) {
		first = x;
		second = y;
	}
	Pair(Pair<T> const& cp) {
		first = cp.getFirst();
		second = cp.getSecond();
	}

	T const getFirst() const {
		return first;
	}

	T const getSecond() const {
		return second;
	}
};

class Solution {
	int n;
	vector<int> v;
	vector<Pair<int>> index;
	Pair<int> indexSol;
public:
	void readData() {
		ifstream f("ssm.in");
		f >> n;
		v.resize(n + 1);
		index.resize(n + 1);
		for (int i = 1; i <= n; ++i) {
			f >> v[i];
		}
	}

	int SSM() {
		vector<int> dp(n + 1);    // vector cu n + 1 elemente (indexarea incepe de la 0)
								  // am nevoie de dp[1], ..., dp[n]

								  // caz de baza
		dp[1] = v[1];
		index[1] = Pair<int>(1, 1);

		// caz general
		for (int i = 2; i <= n; ++i) {
			if (dp[i - 1] >= 0) {
				// extinde la dreapta cu v[i]
				dp[i] = dp[i - 1] + v[i];
				index[i] = Pair<int>(index[i-1].getFirst(), i);
			}
			else {
				// incep o noua secventa
				dp[i] = v[i];
				index[i] = Pair<int>(i, i);
			}
		}

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

		return sol; // aceasta este suma asociata cu SSM
	}

	void print() {
		ofstream g("ssm.out");
		int ans = SSM();
		g << ans << ' ' << indexSol.getFirst() << ' ' << indexSol.getSecond() << '\n';
		g.close();
	}
};



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