Cod sursa(job #2433484)

Utilizator Mihai7Gheoace Mihai Mihai7 Data 27 iunie 2019 16:44:01
Problema Subsecventa de suma maxima Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 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<int> index;
	Pair<int> indexSol;
public:
	void readData() {
		ifstream f("ssm.in");
		f >> n;
		v.resize(n);
		index.resize(4);
		for (int i = 0; i < n; ++i) {
			f >> v[i];
		}
	}

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

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

		// caz general
		for (int i = 1; i < n; ++i) {
			if (dp[(i - 1) % 3] >= 0) {
				// extinde la dreapta cu v[i]
				dp[i % 3] = dp[(i - 1) % 3] + v[i];
				index[i % 3] = index[(i-1) % 3];
			}
			else {
				// incep o noua secventa
				dp[i % 3] = v[i];
				index[i % 3] = i + 1;
			}
			if (dp[i % 3] > sol) {
				sol = dp[i % 3];
				indexSol = Pair<int>(index[i % 3], i + 1);
			}
		}
		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();
}